perm
首先若 (i+j)(i+j)(i+j) 为奇数则需要满足其中一个是奇数,另一个必须是偶数。
若 k=0k=0k=0,那么要求 AiA_iAi 和 AjA_jAj 同号,也就是所有数必须都是同一奇偶性。若满足则答案为 n!n!n! ,否则为 000 。
若 k=1k=1k=1 ,那么要求 AiA_iAi 和 AjA_jAj 异号。奇下标位置为 ⌈n2⌉=x\lceil \frac{n}{2}\rceil=x⌈2n⌉=x 个,偶下标位置为 ⌊n2⌋=y\lfloor\frac{n}{2}\rfloor=y⌊2n⌋=y 个。若 aia_iai 中奇数数量和偶数数量分别为 x、yx、yx、y 或者 y、xy、xy、x 那么就可以成功放进去。而同奇偶性的数顺序无关,所以方案数为 x!y!x!y!x!y! ,否则方案数为 000 。
seg
分析一下美丽区间内的数应该长什么样。不妨设这个区间内的数构成数组 BBB,假设 B1≤B2≤...≤BkB_1\leq B_2\leq...\leq B_kB1≤B2≤...≤Bk,那么限制等价于对于所有 2≤i≤k2\leq i\leq k2≤i≤k 满足 BiB_iBi 是 Bi−1B_{i-1}Bi−1 的倍数。
所以我们只需要选取一些元素加进这个数组 BBB ,也就是把它们放在一起,其余的元素排列顺序无所谓。而且每次要么不选,要么把这种数字全部选完。
因为贡献的计算和最小值有关,所以设 dp(x)dp(x)dp(x) 表示当前加入数组 BBB 里最小值是 xxx 时,BBB 数组大小为多少。
转移有 dp(x)=max(dp(i⋅x))+cnt(x)dp(x)=\max(dp(i·x))+cnt(x)dp(x)=max(dp(i⋅x))+cnt(x) ,然后取 dp(x)×xdp(x)\times xdp(x)×x 的最大值即为答案。
时间复杂度 O(n+AmaxlogAmax)\mathcal O(n+A_{max}\log A_{max})O(n+AmaxlogAmax)。
destroy
摧毁最多的道路就对应着保留最少的路径。当 s1=s2,t1=t2s_1=s_2,t_1=t_2s1=s2,t1=t2 时,直接保留最短路即可。
所以答案上界是 dis(s1,t1)+dis(s2,t2)dis(s_1,t_1)+dis(s_2,t_2)dis(s1,t1)+dis(s2,t2),其中 dis(x,y)dis(x,y)dis(x,y) 表示 xxx 到 yyy 的最短路长度。
但是存在两条路径会重叠的情况,重叠情况只需要被计算一次。
由于 n,mn,mn,m 只有 300030003000 ,所以可以通过枚举两个最短路重叠部分。设枚举的重叠部分端点为 a,ba,ba,b ,那么答案为 min(a,b){dis(a,b)+min(dis(s1,a)+dis(b,t1),dis(t1,a)+dis(b,s1))+min(这里和前一个式子类似)}\min_{(a,b)}\{dis(a,b)+\min(dis(s_1,a)+dis(b,t_1),dis(t_1,a)+dis(b,s_1))+\min(这里和前一个式子类似)\}min(a,b){dis(a,b)+min(dis(s1,a)+dis(b,t1),dis(t1,a)+dis(b,s1))+min(这里和前一个式子类似)}.
所以需要处理任意两点最短路,使用 BFS 即可。时间复杂度 O(n(n+m))\mathcal O(n(n+m))O(n(n+m))。
party
因为 222 操作是对整个连通块做贡献,所以使用并查集维护比较方便,记 cnticnt_icnti 为以 iii 为代表节点的并查集举行了多少次聚会。
现在考虑 111 操作,操作相当于将两个并查集合并。假设将 YYY 合并到 XXX 上,会发现此时 XXX 此前的聚会并未对 YYY 进行贡献。要对 YYY 的代表节点 yyy 再记一个 tmpytmp_ytmpy,表示父亲节点在与自己合并之前,已经举行了多少次聚会,来起到一个差分的作用。
另外多出 111 点关系度的两人,可以用哈希表来记录。考虑查询,如果不在一个并查集里关系度肯定为 000。反之,则先暴力跳到他们的 lcalcalca,再暴力地往上跳,每次先加 cntcntcnt 再减 tmptmptmp。
最后的答案,还要先减去 lcalcalca 两个儿子 tmptmptmp 的较大值,再加上哈希表里二人额外的关系度。因为并查集树高是 logloglog 级别的,所以暴力往上跳的复杂度是正确的。时间复杂度 O(nlogn)O(n logn)O(nlogn)
graph
考虑 L=RL=RL=R ,此时图一定是基环森林。那么只有 TTT 为 SSS 祖先或者 TTT 在环上的时候答案不为 −1-1−1 ,直接把图建出来做就行。
对于其他情况,当 TTT 不在环上时,问题可以转化为:
找到最小的 kkk 使得有 kkk 个值域在 [L,R][L,R][L,R] 中的数和为 aaa 。
这个直接预处理每个 aaa 的答案即可。
当 TTT 在环上的时,问题可以转化为:
找到最小的 kkk 使得有 kkk 个值域在 [L,R][L,R][L,R] 中的数和为 ai+bai+bai+b ,其中 aaa 是环长。
答案是连通块大小级别。因为 kkk 个数能组合出 [kL,kR][kL,kR][kL,kR] 间的所有数,当 kR−kL≥akR-kL\geq akR−kL≥a 的时候一定能覆盖所有同余系。
当 b≥ab\geq ab≥a 时,把限制变为 ci+b%aci+b\%aci+b%a 其中限制 c≥⌊ba⌋c\geq \lfloor\frac{b}{a}\rfloorc≥⌊ab⌋,然后把 [kL,kR][kL,kR][kL,kR] 区间按照 kkk 从大到小排序,维护 c≥xc\geq xc≥x 时候每个同余系的最小的 kkk 。具体实现可能需要提前把区间相交处理一下。时间复杂度 O(nlogn)\mathcal O(n\log n)O(nlogn)。
文章讨论了在给定区间和特定条件(如奇偶性约束、倍数关系)下,如何通过并查集、数的奇偶性分析以及最短路径算法解决数列操作问题。涉及到了计算贡献、转移方程和时间复杂度分析。
1709

被折叠的 条评论
为什么被折叠?



