Cry_For_theMoon  

1. Pastoral Oddities

\(n\) 为奇数的时候,\(\sum deg\) 是奇数,但显然它应该是偶数,换言之 \(n\) 为奇数一定无解。

事实上只要一个连通块是偶数它内部就有解:只用考虑一颗树,我们从叶子开始确定每个点和父亲的连边是否选中即可。和一道 div2 E Tree Sum 非常类似。

也就是有解等价于每个连通块大小是偶数。

最大值最小这个条件容易想到二分,但是有多个询问所以我们采用整体二分。

问题在于这里的询问不是互相独立的,但注意到由于询问单调,所以任意时刻我们关心的询问都是一段区间。即,在一般的整体二分中,对于答案区间 \([x,y]\),相关的询问是一个集合 \(S\),但是在本题中因为询问答案的单调性,所以相关询问一定也构成一个区间 \([l,r]\)

也就是我们可以设计这样一个函数 solve(x,y,l,r) 表示询问 \([l,r]\) 的答案全部落在 \([x,y]\) 范围内;我们找到 \(mid=\frac{x+y}{2}\),找到第一个答案小于等于 \(mid\) 的询问 \(pos\),则划分成了两段 solve(x,mid,pos,r)solve(mid+1,y,l,pos-1)

那么所有边权 \(\lt x\) 且出现时间 \(\lt l\) 的边都应该预先加入,然后我们首先加入出现时间 \(\lt l\) 且边权 \(\le mid\) 的边,然后从 \(l\) 开始枚举边,在边权 \(\le mid\) 时加入,如果某个时刻变得合法了,那么它就是我们找到的 \(pos\) 位置。

这个做法的计算量只是和 \(y-x\) 以及 \(r-l\) 相关的,也就是从答案区间的视角来看每一层的总和是 \(2m\) 这个级别。然后我们要维护的是一个可撤销并查集所以就 \(O(m\log^2 m)\) 了。

记录

2. Eulerian Orientation

一个很玄学的做法。

考虑枚举两条边 \(i,j\) 然后计算包含 \(i,j\) 的合法集合数目。

这个问题不弱于不带任何限制的计数,但是不带任何限制的计数看上去也只能 \(O(m^3)\) 高斯消元,也就是这样就是 \(O(m^5)\) 了(实质上是 \(O(m^4)\),理由下面会讲)。

事实上我们只需要消一次元(注意到任何时刻,一列只有最多两个 \(1\),所以行 xor 一轮最多做一次,所以实质上消元是 \(O(m^2)\))的。则我们会得到下面的结果:

  • 一个自由元集合 \(S\)

  • 任何主元都可以表示成若干个自由元的异或结果(注意这个方程组隐藏的最右边一列永远是 \(0\))。

接下来讨论 \(i,j\) 是否为自由元,特判 \(i=j\) 的情况。有一个前置结论:\(n\ge 1\) 个随机 \(0/1\) 变量异或结果的期望值是 \(\frac{1}{2}\),其实也就是 \(\dbinom{n}{x}\) 的奇数下指标求和。

  • \(i,j\) 都是自由元概率显然是 \(\frac{1}{4}\)

  • \(i,j\) 有一个是自由元,不妨设 \(x_j\) 是。则除非 \(x_i=x_j\) 概率是 \(\frac{1}{2}\),否则还是 \(\frac{1}{4}\)

  • \(i,j\) 都不是自由元,除非 \(x_i,x_j\) 由完全相同的自由元构成,概率是 \(\frac{1}{2}\),否则还是 \(\frac{1}{4}\)

因此消元以后只需要 xor-hashing 就可以在 \(O(m\log m)\) 的时间内求答案。压力来到消元。

问题就是每一轮可能会做一次行 xor,然后如果 \(r_x:=r_x\oplus r_y\)\(r_y\)\(1\) 很多而 \(r_x\) 很少就会寄,最简单的例子就是一个菊花图。

因此我们加入一个优化就是说出现这种情况让 \(1\) 少的去给 \(1\) 多的做 xor 然后就跑的很快,时间复杂度我也不会分析但是似乎各种极端数据都不太能卡。

3. aliens

首先任何一个点,水平/竖直作两条线,和对角线的两个交点,构成一条线段;一个对角线上的正方形可以覆盖这个点,当且仅当其主对角线覆盖这条线段。

因此我们可以把问题变为主对角线上的覆盖问题。

若线段直接出现包含关系,可以删去被包含的一条线段。然后我们把线段按照 \(L\) 排序(此时显然也是按照 \(R\) 排序的)。我们答案的任何一条线段都一定是形如 \([L_i,R_j]\),其中 \(i\le j\) 的。

因此设 \(dp(i)\) 是前 \(i\) 条线段的答案,则容易斜率优化在 \(O(n)\) 的时间内求得答案。

考虑 \(\le k\) 条线段的性质,套 wqs 二分即可,时间复杂度 \(O(n\log V)\)

记录

4. A Nameless Counting Problem

如果没有 \(a_i\) 不下降的限制可以 \(O(n^2\log V)\) 地用数位 dp 求出答案,所以可以在 \(O(n^3\log V)\) 的时间内求出每个 \(i\in [0,n]\),用 \(i\) 个变量得到 \(X\) 的方案数。

现在考虑使用容斥解决 \(a_i\) 下降的问题。首先如果可以求出 \(g(i)\) 表示 \(i\) 个不同变量得到 \(X\) 的方案那么首先强制 \(g(i)\) 有序,然后得到原问题的话只要剩下若干个元素,每个出现了偶数次,总次数是 \(n-2i\) 就行,这里插板就好。所以问题变成了求 \(g(i)\)

考虑使用集合不相等容斥,也就是所谓容斥系数是 \((-1)^{x-1}(x-1)!\) 的那个。

然后我们这里必须一步到位(因为最外层套了一个异或和的限制),也就是直接把 \(i\) 个点划分成若干个连通块,把系数相乘;然后偶数连通块的方案数直接就是 \(m+1\);奇数的话设有 \(x\) 个那么就是 \(f(x)\) 了;所以我们注意到奇偶要分开来的。使用类似 egf 卷积的手法可以 \(O(n^3)\) 计算出来。

时间复杂度 \(O(n^3\log V)\)

记录

5. 麻将

厉害题。

考虑判胡就是一个不太能 \(O(1)\) 的事情,只能用 dp:也就是设 \(f(i,j,k,0/1)\) 表示考虑完了点数 \(1\sim i\) 的牌,剩余了 \(j\)\((i-1,i)\)\(i+1\) 去配对,除此之外还剩下了 \(k\)\(i\) 去和 \((i+1,i+2)\) 配对,且是否凑出雀头的方案数。

一个显然的事情是 \(j,k\lt 3\),然后第一维度其实是不重要的,我们如果把整个节点 \((j,k,0/1)\) 的值这个 \(18\) 元组作为状态那么搜出来只有 \(1000\) 多种状态,且其显然是 DFA:接受若干张 \((0\sim 4)\) 下一种点数的牌。(这里要把所有终止节点都设为 \(0\) 且规定 \(0\) 永远得到 \(0\))。

然后就是在自动机上直接 dp 就好了,七对子在外层 dp 的时候记录一下几种点数的出现次数 \(\ge 2\) 就可以了,跑的很快啊。

记录

6. Gachapon

首先 min-max 容斥一手但是这个 min 看上去也很谔谔啊。

如果我们假设每次操作都会落在集合内子集内那么就很友好至少你知道操作是有限次。

那么大概可以算出 \(g(i)\) 表示 \(i\) 次操作仍然没有合法的情况,也就是每个元素拿出最多 \((b_i-1)\) 个用 egf 类似的东西卷一下就好了。

然后 \(\sum g\) 就是期望。(\(g\) 下标从 \(0\) 开始)

然后现在就是有时候操作会落在集合外面,如果确定了集合 \(T\) 那么中间浪费的期望步数是确定的 \(\frac{sumall}{sumS}-1\),换言之你期望浪费这么多步才能得到一个有效步数。

设这个是 \(t\) 那么答案就是 \(t\times \sum g\)

发现我们最后只关注 \(\sum A\) 和选出来的个数(也就是不超过 \(\sum (B-1)\) 的东西),随便 dp 一下就好了,大概是 \(O(\sum A\times (\sum B)^2)\) 的。

记录

7. Yet Another Permutation

不超过 \(i\) 次操作能得到的排列,是所有最长连续上升段长度 \(\ge n-i\) 的排列。

因此我们对每个 \(f(k)\) 计数,也就是最长连续段长度 \(\le i\) 的,然后容斥掉。

\(f(k)\) 的计算就是:钦定集合 \(T\) 内填大于号其它填小于号,且 \(T\) 划分出的 \(|T|+1\) 段长度都 \(\le k\)

对每个集合 \(T\) 计算答案也是困难的,使用容斥,把 \(T\) 的一个子集 \(S\) 拿出来,容斥系数 \((-1)^{|S|}\),把对应位置反转成小于号;\(T-S\) 的符号擦掉,也就是不管它。

那么就是划分出若干个上升段,egf 卷一下即可。

实质上最后 dp 的过程中我们直接划分上升段,乘上对应的容斥系数即可。

容斥系数 \(g(i,j)\) 表示 \(\sum_{x_1+x_2+...+x_k=i}[\max x\le j]\times (-1)^{k}\)

直接背包可以 \(O(n^3)\) 计算完容斥系数然后 \(O(n^3)\) dp,看上去没有任何优化余地了。不过卡卡常也就一秒出头。

打个表会发现这个容斥系数的规律很强而且取值只有 \(O(\frac{n}{i})\) 项不为 \(0\) 然后就 \(O(n^2\ln n)\) 了。

不会证。

记录

8. 神经网络

更神秘了......

相当于对圆排列计数,\(n\) 个条件是相邻两项有连边。

容斥掉,也就是相邻两个没有连边等价于在一棵树且不相邻。

然后划分成了若干段,每段都是在一棵树内的。

还是不好算,内部再套一层容斥,把一些相邻的节点强制变成树上相邻。

然后就是把这棵树划分成若干条路径(单点也算)且非单点路径贡献是 \(2\),随便嗯dp 一下。

然后对每棵树分开考虑贡献,一条路径必须完整在一个连续段内。如果划分出了 \(j\) 条路径就等价于 \(j\) 个元素了,然后划分进若干个集合,集合是区分的。

因为集合是区分的所以就算是一棵树划分出的两个集合也可以认为是完全区分开来的两个不同元素。然后设 \(dp(i,j)\) 是前 \(i\) 颗树划分出了 \(j\) 个颜色然后最后 \(dp(m,j)\times fact[j-1]\) 再乘上外层(也就是第一次容斥)的容斥系数就行了。

复杂度大概是平方的。

记录

P.S. 这里写的时候脑子不太清楚,可以看到计算 dp 的时候把 \(g\) 这个东西乘了一个 \(\frac{1}{k!}\) 类似 EGF 卷积,但实质上计算大 \(G\) 的时候也乘了一个阶乘。意思就是分组的时候先把组认为是有序的,但其实组应该是无序(但有差异)的,然后再最后大环计算的时候乘个大阶乘,所以计算大 \(G\) 乘阶乘,dp 合并的时候除掉阶乘这样的。

9. 一个神秘模拟题

给一个文本串 \(s\) 和一个模式串 \(t\),文本串带通配符,问可能的最大模式串出现次数并且求一种方案。\(|s|,|t|\le 10^5\)

如果能求出每个位置开头是否能匹配,我们可以设 \(dp(i)\) 是最后一次匹配开头位于 \(i\) 向后能匹配的最大次数,记录前驱就可以简单构造。

考虑转移,问题在于如果两个串出现重叠的情况。

我们会发现如果 \(i\)\(j\) 两处开头都是模式串且 \(i\lt j\) 说明周期是 \(j-i\)

我们找到最小周期 \(g\),那么 \(g\) 的倍数也是周期。把这些周期去掉;划分成若干个等差数列,经典结论是最多 \(O(\log)\) 个。

此时对每种数列 \(g,2g,3g,...,kg\),把 \(s\) 位置按照模 \(g\) 余数去划分就能转移。

写个单调队列最轻松但是似乎 deque 有点多(MLE警告),还得双栈模拟;所以不如开点 seg 多个 log 啥的。

压力来到这个通配符匹配的 kmp 过程,看上去随便 kmp 啊,然后就寄了。

原来竟然可以卷积做字符串匹配的。就是说定义 \(F(i)=\sum_{j=0}^{m-1}(S_{i+j}-T_{j})^2\) 可以认为两个串相等当且仅当 \(F(i)=0\)\(F(i)\) 是可以差卷积的;带通配符就把平方后面乘个 \(S_{i+j}\),把通配符设为 \(0\) 即可。

复杂度可以做到 \(1\log\),偷懒写了 seg 就 \(2\log\) 了。

10. Wooden Spoon

感觉是见过的比较水的 1D。

可以发现虽然 \(2^n\) 但是和状压联系不大。事实上可以建树然后一个节点的值就是子树内最小值。问的是对于每个 \(i\) 有多少个排列使得建出来的树,\(i\) 向上走的过程中每一步的值都和上一步不一样。

不妨设 \(i\) 始终位于最最最左边,最后把答案乘上 \(2^n\) 即可。

然后设 \(f(i,j)\) 是我们考虑完了前 \(i\) 个人,在最左边这条路上已经确定填了 \(j\) 个数的方案数(不难发现从祖先往下走数只会越来越大)。

则有:

  • \(f(i,j)\times (2^n-2^{n-j}-i)\rightarrow f(i+1,j)\)

  • \(f(i,j)\times 2^{n-j-1}\rightarrow f(i+1,j+1)\)

  • \(f(i,j)\times (2^n-i-1)! \rightarrow ans(i+1)\)

时间复杂度 \(O(n2^n)\)

记录

11. Trio

看到 first time 就上容斥啊,显然要求两个东西:\(i\) 秒后三人重合的方案数;以及如果初始三人在同一位置,\(i\) 秒后三人重合的方案数。

算出这个就嗯套分治 NTT 形式的容斥了,感觉典中典了。然后第一个显然比第二个强。

设三人位置是 \(x\le y\le z\) 那么令 \(a=\frac{y-x}{2},b=\frac{z-x}{2}\),显然要求的是:

\[f(i)=\sum_{j=0}^{i}\dbinom{i}{j}\dbinom{i}{j+a}\dbinom{i}{j+b} \]

看到这个就被劝退了,原来是能做的啊,乐。

把组合数拆开剩下六个阶乘逆元也就是 \(\frac{1}{j!(i-j)!(j+a)!(i-j-a)!(j+b)!(i-j-b)!}\)

\([x^i]F(x)=\frac{1}{i!(i+a)!(i+b)!},[x^i]G(x)=\frac{1}{i!(i-a)!(i-b)!}\),则显然有:\(f(i)=(i!)^3\times [x^i]F\times G(x)\),卷一下就行了。

时间复杂度 \(O(T\log^2 T)\)

记录

12. First Come First Serve

拜谢 miao22 的容斥做法。

不同的操作序列可能得到相同的结果,我们令 \(c_i=0\) 表示第 \(i\) 条线段选择左端点;\(c_i=1\) 表示其选择右端点。

如果有两个不同的操作序列,记作 \(c_1,c_2\) 得到了相同的结果。考察其第一个不同的位置 \(k\)\(c1_k=0\)\(c2_k=1\)。此时当且仅当所有和区间 \(k\) 有交的区间,在它左边的选 \(0\);在它右边的选 \(1\),此时 \(c_1,c_2\) 才可能导出相同的结果序列。

换言之对于每个点都钦定了以它为中心的一段区间的形态:形如 \(\text{00000-itself-11111}\),注意到两个不同的约束如果有交不可能同时满足,所以容斥就非常简单了,时间复杂度 \(O(n)\)

记录

13. 愤怒的小 N

考虑从高位到低位一位一位拼上去,那么我们要处理 \(f(i,j)\) 表示前 \(2^i\) 个数里有所有奖励关的编号的 \(j\) 次方和;类似处理 \(g(i,j)\) 表示普通关,它们是相互转移的,暴力做可以 \(nk^2\) 获得 60pts 的优秀成绩。

考虑这个长得很插值。实际上根据 \(f,g\) 的递推式可以推出当 \(i\gt j\) 的时候 \(f(i,j)=g(i,j)\) 然后只用对末尾 \(O(k)\) 个做 dp 剩下的插一次值就行了,时间复杂度 \(O(n+k^3)\),但好像有点卡常。

记录

14. Square Constraints

这个性质看着太差了然后考虑打个表先。然后发现还是没有什么规律。

但是至少每个位置的候选是个区间然后我们只输出区间左右边界看看,还是没什么明显规律。

不过还是有一些性质的。

首先后一半的左端点都是 \(0\),同时整体的左端点和右端点都是单调不升的。

一个重要的性质:前一半的区间交起来非空,因为 \(n\) 这个数始终在前一半的候选里。

然后就直接嗯容斥了,变成每个位置的候选是个前缀,如果前缀可以做到有序就可以了。

把前一半按照 \(L-1\) 排序后一半按照 \(R\) 排序。

枚举总共有多少个前一半的地方选了 \(L-1\),内层设 \(dp(i,j)\) 是遍历了前 \(i\) 个,有 \(j\) 个属于前一半的地方选了 \(L-1\),时间复杂度 \(O(n^3)\)

记录

15. 树上的孤独

多少有点。

首先如果没有 T1 的限制,也就是问题变成了查询一个点为根的子树,深度小于等于某个值,有多少个不同颜色。我们想想这个问题可以怎么做。

比较显然子树可以转成 dfn 序上的一段区间,dep 作为第二个维度。我们对每种颜色建出虚树,虚树上一条边,对应一条根链的局部。用树上差分的方式维护这个东西,然后再使用主席树套一下就能在线了。

考虑 T1 的限制,首先这个强制在线是告诉你 \(p_1,p_2\) 的,而且操作 \(2\) 不加密。所以我们可以每次询问的时候把 \(O(n)\) 个可能关注的颜色全部塞到 \(p_2\) 这个节点。\(p_2\) 这里把树上差分的标记来启发式合并一下就可以把 \(O(nq)\) 个东西先提前查询出来。最后真正查询的时候把应该查询的颜色看一下值是多少就行了。

时间复杂度 \(O(nq+m\log m)\),但常数感觉不是很小的样子。

记录

16. Xor Sum 5

考虑选了 \(c_i\)\(x_i\) 的话方案数是 \(\dbinom{k}{c_1,c_2,...,c_n}\),它是奇数根据 lucas 当且仅当 \(k \and c_i=c_i\)\(c_i \and c_j=0\)\(c_1 \or c_2 \or ... \or c_n = k\)

其实就是给 \(k\) 中每个带 \(1\) 的位选择一个 \(2^{bit} \times a_i\) 加上去。

然后就可以数位 dp 了:设 \(f(i,j)\) 是最低的 \(i\) 位之前给的进位是 \(j\) 的方案数,直接 dp 就 \(O(na\log k)\) 了。

但是统计答案的时候会被坑:我们只算了最低若干位的方案,实际上是要考虑高位的方案数的(虽然是随便选),判一下就好了。

记录

17. 超级马

这个难度评级很符合我对洛谷的想象。

感觉倒着推容易一点。

如果允许系数是任意实数,我们都知道任何两个不共线平面向量可以表出任何一个与它们在同一平面上的向量。

当系数为整数时,容易联想到 Bezout 定理。

\(Span\{v_1,v_2,...v_k\}\)\(k\) 个向量在整系数下可以表成的所有向量集合,显然有:

\[Span\{v_1,v_2,...,v_k\}=Span\{v_1+v_2,v_2,...,v_k\} \]

因此当 \(k\ge 2\) 的时候我们可以做辗转相减,更进一步地可以辗转相除。

也就是,我们从 \(2\) 个变量开始 \(x,y\) 开始:由于可以不断地把 \(x\) 替换成 \(x-y\),我们在两个变量的第一维度不断辗转相除,最后一定会得到 \((x_0,y_0)\),它和 \((x,y)\) 表出的向量集合等价且 \(x_0=(0,k)\)

\(n-1\) 次这个操作则最后只有最多一个向量的 \(x\) 不为 \(0\)

显然如果 \(n\) 个向量的 \(x\) 都不为 \(0\) 是无解;否则它必须是 \(1\) 或者 \(-1\)。考虑剩下 \(n-1\) 个向量实质上只关注 \(y\)\(\gcd\),根据 Bezout,当且仅当 \(|\gcd|=1\) 的时候可以表示出所有数。

现在考虑只允许正系数的情况。如果所有向量可以被一个半平面框住(这可以极角排序后判断相邻两个向量的夹角差是否全部不超过 \(\pi\) 判断)则显然我们能走到的点也全部位于该半平面内,否则我们可以认为操作是可逆的(也就是允许取负整数系数)。

理由是我们一定能在坐标轴上的四段(\(x,y\) 轴的正负半轴)找到四个点使得它们是可达的。有了四个坐标轴上的操作,对于任何一个操作 \((x,y)\) 总能用它们表出一个向量 \(k(-x,-y)\),其中 \(k\) 是正整数。在此基础上加上 \((k-1)(x,y)\) 就完成了操作的可逆性。

至此本题在 \(O(n\log V)\) 的时间内解决。

18. Non-Adjacent Matching

牛逼题。

首先为合法的序列寻找一个容易计数的充要条件,套路是寻找一个很显然的必要条件然后说明它充分?

结论是:度数和 \(S\) 为偶数且任意两个相邻点的度数和都不超过 \(\frac{S}{2}\) 等价于有解。

必要性显然,充分性考虑令 \(b_i\) 为两者之差,当 \(S\neq 0\) 的时候 \(b_i\)\(0\) 的位置不超过 \(3\) 处,讨论一下就可以发现一定可以让操作后 \(\min b\ge 0\)

然后嗯计数一下就行了,不想写了,感觉大家都会了。就是容斥一下,因为不合法位置最多两处且如果有两处肯定是相邻的。

时间复杂度 \(O(nm+m^2+k)\)(至少我是这个)。

记录

19. Candy Retribution

\(m=n-m\),我们考虑第 \(m\) 小和第 \(m+1\) 小相同的计数。

首先把值落在 \([L,R]\) 转成 \(\le R\)\(\le L-1\),现在和只有上界了,设上界是 \(k\)

如果忽略 \(a_m=a_{m+1}\) 则方案数显然为 \(\dbinom{k+n}{n}\)

容斥掉 \(a_{m}\neq a_{m+1}\) 的情况(这让有无标号的转换变得容易),枚举 \(a_m\) 的值 \(v\),首先选出 \(m\) 个的方案数是 \(\dbinom{n}{m}\),然后它们 \(\le v\),剩余 \(n-m\)\(\gt v\)

这里要保证至少有一个 \(=v\),再容斥掉,也就是 \(\le v\) 的减去 \(\le v-1\) 的。

那么前 \(m\) 个,每个的 GF 都是 \(\frac{1-x^{v+1}}{1-x}\),后面的 \(n-m\) 个是 \(\frac{1}{1-x}\),因为是前缀和那么再乘上一个 \(\frac{1}{1-x}\)

也就是 \([x^{k-(v+1)*(n-m)}](1-x^{v+1})^m \times (1-x)^{-(n+1)}\)

注意到,后面这个式子和 \(v\) 无关可以预先计算,前面半部分只关注 \(O(\frac{k}{v})\) 个取值,因此总复杂度是 \(O(k\ln k)\) 的。

记录

20. Special Edges

好题。

首先最大流是不好做的,考虑把最大流转成最小割。由于特殊边是固定的,我们暴力对 \(2^k\) 种情况(也就是如果割就把这条边 ban 掉,否则容量设为 \(25\))求最大流即可,这样预处理后询问可以做到 \(2^k\) 单次。

预处理直接跑 \(2^k\) 次 dinic 比较蠢,注意到 \(2^k\) 张图差异是很小的,先对 \(m-k\) 条边的图跑 dinic,然后每次按顺序加一条边(容量 \(25\))继续增广,记录一下此时的操作便于撤销即可。

这里由于加一条边的容量很小,把 dinic/EK 换成 FF 会快很多。

很卡常,神秘题。

记录

21. 音符大师

考虑设 \(f_i,j(k)\) 表示一个音符的左端点位于 \(a_i-j\) 处,另一个音符的左端点位于 \(k\) 处的答案。

考虑 \(f_i\rightarrow f_{i+1}\),如果是位于 \(a_i-j\) 的这个人过去,那么注意到是整体加一个值,然后 seg 合并过去;如果是 \(k\) 这个人过去,那分讨一下这个音符和 \(a_{i+1}\) 的关系,比较麻烦的是如果已经包含 \(a_{i+1}\)\(O(L)\) 种情况。所以转移 \(1\)\(O(nL\log n)\) 的,转移 \(2\)\(O(nL^2\log n)\) 的,可以获得 60 pts。

实现的时候,我们的 \(dp(i,j)\) 其实是动态开点 seg 的指针,所以并不一定要 \(a_i\rightarrow a_{i+1}\) 这样。因为我们注意到:任何时刻音符要么位于某个 \(a_i\) 要么位于某个 \(a_i-L\)(左端点)。因此我们只用设,\(dp_{i,0/1}(j)\) 表示一个人位于 \(a_i/a_i-L\),另一个人位于 \(j\)(处理完了前 \(i\) 个字符)。转移只需要考虑下次谁动,如果是 \(a_i\) 这个人动,找到第一个不在他里面的 \(a\),设为 \(x\),seg 合并过去即可;否则,就是 \(j\) 这个人动,如果 \(j\) 也和 \(x\) 不重合,那么 \(j\) 也会转移到 \(x\)。有 \(O(L)\) 种情况,是 \(j\)\(x\) 也重合的,此时找到 \(i,j\) 两个人都不包含的第一个人 \(x'\)\(j\rightarrow x'\)\(i\rightarrow x'\) 都处理一下即可。

如果我们能预处理那个东西(记作 nxt 和 nxtnxt)那么就可以 \(O(nL\log)\) 了。nxt 的处理是容易的,nxtnxt 如果硬上就是区间 upper_bound,但如果我们倒着加数其实就是一个单点修改区间求 min 的 seg,也可以 \(O(nL\log)\) 地处理出来。

记录

22. Bow Meow Optimization

如果 A 和 B 的放置方式确定了,则我们可以很容易 \(O(n)\) 计算答案,因为每个位置的系数是确定的,只需要倒序安排 \(a/b\) 即可。

另一方面,我们不难看出,A,B 的系数序列是单谷的。

不难证明:A,B 的系数序列的谷底一定靠在一起,如果它们中间有其它的数,可以交换出去。

我们容易发现以这个谷底为中心,则 \(A,B\) 安排的值分别是单谷的,也就是左边单调减,右边单调增;如果我们能够说明在左半边,\(A,B\) 合在一起看也是单调减的,右半边类似是单调增即可 \(O(n^3)\):设 \(dp(i,j,k)\) 是把猫狗放在一起排序,前 \(i\) 个,左边给了 \(j\) 只猫 \(k\) 只狗即可。

这基于另一个结论:如果 \(n(m)\) 是奇数,则在中间留一个隔开,剩下的偶数个 \(n,m\) 会在两边对半排开。证明方法类似证明谷底靠在一起,用交换来证。

然后就可以说明了,但是要特判把 \(a,b\) 最大的留给中间的谷底(如果是奇数)。时间复杂度 \(O(n^3)\)

总而言之这个最优形状最后长的是很好看的。

记录

23. Patterned Cylinders

这个 PE 被改进模拟了,\(n,m\le 10^9,k\le 40\)

首先 \(k\) 种颜色都出现很容易想到用容斥解决掉,因此我们忽略这个限制,做 \(k\) 遍新的问题即可。

旋转翻转去重看上去很群论,直接上 Burnside,容易发现,首先最后两种操作有交换律,而翻转可以最开始各最多做一次(且仅在 \(\ge 3\) 的时候有意义),有 \(4\times n\times m\) 种置换。(指 \(n,m\ge 3\) 时)

如果只有旋转,则操作相当于每个位置偏移 \((+x,+y)\)(模意义下),且行列分别看构成的置换环长度是 \(\frac{n}{\gcd(n,x)}\)\(\frac{m}{\gcd(m,y)}\)

在合并结果的时候我开始以为是很简单的环数乘起来就行,最后还是佳老师指点了一下:如果置换环长分别是 \(\langle r \rangle\)\(\langle c \rangle\) 数组,则最后总置换环个数是 \(\sum_{i,j}\gcd(r_i,c_j)\)

可以发现行列置换环长都是一样的所以可以 \(O(1)\) 合并。

考虑带翻转,这里 tzc 告诉我手玩一下就可以了,和循环移位没有关系了,玩了一下确实。理性分析一下是这样的:循环移位可以看作整体 reverse 以后,选一个位置 \(i\),把 \([1,i]\)\((i,n]\) 翻转(ARC153B 用到了),那么你先翻转再循环移位就只有分两段分别翻转了!

所以本质上操作是循环移位或者分两段翻转,但是 \(len\le 2\) 的时候后一种操作是无用的,\(len\ge 3\) 的时候后一种操作能得到的结果循环移位都是得不到的(感觉环翻转从 \(\ge 3\) 开始似乎很常见)。

然后这个时候就可以发现这个操作只和 \(len\) 的奇偶性以及两段的奇偶性有关,拆出来不同环长也是 \(O(1)\) 个。

因此单次已经可以 \(O(d(n)d(m)\log p)\) 计算答案了,求 \(k\) 次就行。

24. 榕树之心

首先来看 subtask3,这个很容易让人联想到每次选两个子树 \(-1\) 问最后能不能都变成 \(0\) 的一个问题。

首先 \(n-1\) 是奇数不行。否则如果最大的数 \(mx\le s-mx\) 一定赢,否则问题就出在重儿子上。

如果重儿子是一条链(task 2)则它是没救的,否则考虑两个不为祖孙关系的点是可以相互抵消的。

因此最后重儿子如果抵消干净一定是一条链,但是如果这条链太短其它的轻儿子成为了非常大的重儿子就寄了。

不过抵消是两个两个消的,所以如果出现这种情况你可以认为就是消干净了,因为可以在 \(mx=s-mx\) 的时候就停下来这个感觉。

因此设 \(f(u)\)\(u\) 子树内消完留下的链最短是多少(忽略 \(u\) 本身),如果 \(sz(u)-1\) 是偶数,那么 \(f(u)=\max\{0,f(v)+1 - (all-sz(v))\}\)

这里 \(v\) 是重儿子,\(all\)\(sz(u)-1\)

如果 \(sz(u)-1\) 是奇数,则答案最后再和 \(1\)\(\max\)

这样解决了 subtask3,考虑拓展到任意点,只要把点 \(x\) 到根的路径缩成一个点就行了,也就是最后在这个特殊点把路径上所有邻居的 dp 信息合并起来,但我们其实只关注重儿子是哪个,很容易在 \(O(n)\) 或者 \(O(n\log n)\) 的时间内解决,不需要换根。

记录

posted on 2023-02-04 10:01  Cry_For_theMoon  阅读(574)  评论(10编辑  收藏  举报