Atcoder 板刷记录

Atcoder 板刷记录

AGC001

A

排序后相邻配对即可,显然最优。

B

递归思想,及时发现同类问题

走了两步之后就是平四对角顶点距离计算

C

要求树的直径的长度,可以考虑 \(dp_{u,i}\) 为子树 \(u\) 保留最长链为 \(i\) 的答案

在这里可以设为最大保留点数,转移显然

D

重要结论:

  • 长度为 \(n\) 的回文串会提供 \(\lfloor\frac{n}{2}\rfloor\) 对等式
  • 等号可以连无向边,连通说明相同

所以 \(\lbrace a\rbrace,\lbrace b\rbrace\) 奇数不超过 \(2\) 个,不然边数 \(<n-1\),不可能相同

手玩可以发现 \([1,i],[1,i+1]\) 都回文会给出 \([1,i+1]\) 相同,据此构造策略即可

E

很经典啊,组合数组合意义经典应用。

\[\sum_{i=1}^n\sum_{j=i+1}^n{a_i+b_i+a_j+b_j\choose a_i+b_i} \]

显然可以用容斥将 \(i,j\) 全部拿到 \([1,n]\)

\({a_i+b_i+a_j+b_j\choose a_i+a_j}\) 可以看作 \((-a_i,-b_i)\to (a_j,b_j)\) 的方案数,每次 \(x+1\) 或者 \(y+1\)

所以可以用 \(DP\) 合并计算,每个 \((-a_i,-b_i)\) 都可以当作一个起点,每个 \((a_i,b_i)\) 都可以当作一个终点,那么就可以 \(f_{i,j}=f_{i-1,j}+f_{i,j-1}\) 合并计算了。

	for(int i=1;i<=n;i++)cin>>a[i]>>b[i],f[up-a[i]][up-b[i]]++;
    for(int i=1;i<=(up<<1);++i)for(int j=1;j<=(up<<1);++j)(f[i][j]+=f[i-1][j]+f[i][j-1])%=p;
    int res=0;
    for(int i=1;i<=n;i++){
        res=(res+f[up+a[i]][up+b[i]])%p;
        res=(res+p-C((a[i]+b[i])<<1,a[i]<<1))%p;
    }
    res=res*inv[2]%p;

F

经典结论:若对于 \(|i-j|\ge k,|p_i-p_j|=1\)\(p_i,p_j\) 可以进行交换,则最终得到的排列 \(q\) 必然满足 \(\forall 1<|i-j|< k,(p_i-q_i)(p_j-q_j)>0\)

可以用逆排列,就变成了相邻两个数,差 \(\ge k\) 可以交换,则最终差 \(<k\) 的,相对顺序始终不变。且这玩意充要。

然后就变成了套拓扑了。

AGC002

A

过于水

B

考虑一个盒子如果有红球,则一方面红球可能到过它,二方面是到达时刻在其上一次被清空之后。具有传递性,只是如果被清空需要清空标记。

C

考虑终态和极限位置

注意 \(a_i+a_{i+1}\) 的最大值,如果这玩意都不能断开,则显然最终剩下的最后一个结断不开,否则就保留这个,依次删前后缀,最后删自己。

D

整体二分模板题,整体二分+可撤销并查集维护连通性

E

比较简单的博弈题。

显然先对 \(a\) 做递降排序,然后考虑两类操作的本质。

把石子个数看作一个直方图

然后做操作一相当于跳到下一个矩形里面去,做操作二就相当于删掉最下面一行,相对而言相当于将自己上移一格

然后碰到边界相当于必胜态,对于这个图手推一下,不妨设 \(f(i,j)\)\((i,j)\) 必胜 \(1\) 还是必败 \(0\),显然有 \(f(i,j)=(f(i+1,j)\&f(i,j+1))\oplus 1\)

找找规律发现 \(k=1\) 斜对角线除掉边界状态一样,所以计算最接近边界的那个点的值即可。

再推推,相当于那个点与边界的 \(\Delta x,\Delta y\) 里面有一个是奇数就必胜了。

F

不知道为啥评黑,感觉很简单的一个计数。

你考虑白球不区分,颜色球要区分,所以考虑把白球和颜色球分开放。而每个颜色球一次性插完最方便

所以设 \(f_{i,j}\) 为放了 \(i\) 个白球和 \(j\) 种颜色球,显然必然有 \(i\ge j\) 才合法。

而我们考虑现在局面下第一个未放球的位置怎么办,可以放一个白球 \(f_{i-1,j}\to f_{i,j}\),可以放一整个颜色球,一共 \(k-1\) 个,且第一个必须放在第一个未放球的位置,所以有 \(f_{i,j-1}{nk-i-(j-1)(k-1)-1\choose k-2}\to f_{i,j}\) 注意特判 \(k=1\)

注意放球过程中未区分各个颜色的顺序,所以乘上 \(n!\)

AGC003

A

过于水,只需要判断 \(NS\)\(WE\) 的出现状态是否相同。

B

显然先自配,然后考虑把没配的显然只能剩下一个。

考虑其能与 \(i+1\) 配对,只能是 \(a_{i+1}>0\)\(a_{i+1}\bmod 2=1\)

这样就配对即可,否则考虑若 \(a_{i+1}>0\),则可以将这个余下的 \(1\) 移动到 \(i+1\),构造很简单。

这样可以保证尽可能的配对。

C

翻转三个元素本质上是对下标奇偶性相同的进行交换,根据冒泡原则可以将奇数位和偶数位的值任意变换(排序)

所以你考虑最终状态,下标和值奇偶性相同就可以只用操作二,没有代价。

而如果不同,可以先通过操作二把这些位置变成一个前缀,然后相邻交换达到合法。

所以设 \(c=\sum [a_i-i\bmod 2=1]\) ,则 \(c\) 必然是偶数,因为都是偶数次变化,答案就是 \(\frac{c}{2}\)

D

水题,显然把指数对 \(3\) 取模,这样得到的两个值若积为完全立方数,则两两是配对。不妨把这个数表示为 \((c_1,c_2……)\) 也即每个质因子的指数。

则两个数 \(i,j\) 积为完全立方数显然有 \(\forall k,c_{i,k}+c_{j,k}\bmod 3=0\),又有 \(c\in [0,2]\),所以必然两个数两两对应。处理出来每对数,取出现次数更多的一个即可

E

系数前推,延迟计算 的思想非常妙啊。

经典结论,对于 \(n\ge p,n\bmod p\le \frac{n}{2}\),证明显然。

先做一遍单调栈,去掉无用决策,此时 \(q\) 递增。

考虑设数组 \(v[x]\),指最终序列长度为 \(x\) 的前缀,对 \(1\sim n\) 的贡献。

则显然有 \(v[x]=v[q_j]\lfloor\frac{x}{q_j}\rfloor+v[x\bmod q_j]\) 其中 \(q_j\) 是小于 \(x\) 的里面最大的 \(q\)

显然我需要计算的是 \(v[q_m]\)

看起来很复杂,事实上划分同类问题。而我们从后往前推,直到 \(x\le q_1\),此时必然对 \(1\sim x\) 的贡献相同,可以直接差分计算。

那么我们可以 延迟计算,初始化 \(f_m=1\),这是计算系数。

然后枚举 \(i:m\to 1\),拿出系数 \(f_i\),令 \(x=q_i\),然后开始暴力往前跳,并且跳到节点 \(q_j,f_j\leftarrow f_j+f_i\) ,最终 \(x\le q_1\) 时,将 \([1,x]\) 全部加上 \(f_i\),可以差分办到。

\(O(n\log n)\)

F

注意原图形连通。不妨记录黑点为 \(1\)

显然分形之后只有左右上下的黑点会与外界接触

所以如果没有这样的点,那必然是独立的

而且更进一步,以上下为例,必须在同一列最上面最下面都是 \(1\) 才行

不妨记这样的列个数为 \(a\),行个数为 \(b\)

\(a=b=0\),显然答案就是 \(cnt_{1}^{k-1}\)

\(a>0,b>0\),显然向上下生成的会相连,向左右生成的会相连,所以始终相连,答案是 \(1\)

现在考虑 \(a>0,b=0\) 的情况,如果不是可以进行整体的翻转,显然不影响答案

连通块个数=点数-关键边个数,其中关键边个数就是从已知边集里选最少的边达到同样的连通效果的边数。

考虑 \(a>0,b=0\),则竖着连的必然会相连,而横着连的必然不会相连

必然满足某种递推关系,矩阵乘法应该没跑

注意到一个有意思的结论 \(k\) 级分形图中连通块个数等价于 \(k-1\) 级分形图点数减去 \(k-1\) 级分形图竖着两个连续的 \(1\) 的个数。

证明考虑竖着的两个 \(1\),其变换之后仍然相连,不会变成新的连通块,而横着的会分离,而 \(k\) 级图中 \(1\) 级图有 \(k-1\) 级图那么多个,而且会合并 \(k-1\) 图中竖着两个 \(1\) 个数次。

所以我们只需要计算竖着连续 \(1\) 个数,考虑原本的会乘上原点数倍,而新产生的取决于同一列上下两个均为 \(1\) 的列个数,而新的同一列上下两个均为 \(1\) 的列个数就是原本的竖着连续个数乘上 \(1\) 级图中的上下两个均为 \(1\) 的列数

定义 \(a\):上下两个均为 \(1\) 列数,\(b\) 竖着 \(1\) 对数,\(v_i:\) \(i\) 级分形图点数,\(b_i:\) \(i\) 级分形图上下 \(1\) 个数。

\[\begin{aligned} &v_i=v_{i-1}\times cnt\\ &b_i=b_{i-1}\times a+b\times v_{i-1}\\ &[v_{i},b_{i}]\times \begin{bmatrix} cnt&b\\ 0&a\\ \end{bmatrix} =[v_{i+1},b_{i+1}] \end{aligned} \]

AGC004

A

容易发现 \(a,b,c\) 只要有一个偶数就就可平分,不然差就是 \(\min(ab,bc,ac)\)

B

可以 \(O(n^2)\),所以可以考虑枚举操作 \(2\) 使用次数 \(c\),这样的话求这种情况的最优解本质是对于每个位置 \(k\) 其史莱姆可以从 \([k-c,k]\) 里面拿最小的,当然是环意义下的区间。

可以用DP简化计算,设 \(f_{i,j}\) 为位置 \(i\) 在整体用 \(j\) 次的情况下拿到的最优值,那显然就是 \(f_{i,j}=\min(f_{i,j-1},a_{i-j})\)

最后答案就是 \(\min_{c=0}^n{kc+\sum_{p=1}^nf_{p,c}}\)

C

容易想到,如果我原本就有一种划分方案使得互连通且位置不重合,我把原本的格子染上同一种颜色就行了,颜色的增加必然不会影响原本的元素的连通性,只要增加的颜色同样能够与原本的连起来就可。

考虑一个强化的条件,每个原本的划分方案中,任意一个红色的格子与蓝色的连通块是直接相邻的,蓝色格子与红色连通块同理,这样就可以在任意的初始条件下达到要求。又有边界没有格子,所以。

可以发现染成梳子一类的东西就行了。第一列全红,最后一列全蓝,从上往下奇数列全红,偶数列全蓝,然后把题目要求出现的格子也加到方案里面就行了。

D

由于 \(\gcd(n,n-1)=1,N\ge 2\),所以 \(1\) 必然是自环。
这样问题就变成了用最小的调整次数,让所有点的深度不大于 \(K\)。(根节点深度为 \(0\)

一个很 naive 的想法是对于深度 \(>K\) 的全部调整,然后调整后再判深度 \(>K\) 的。但是不幸的是这是错误的,原因是两个被调整的可以调整他们的 LCA 减少操作次数。

这启发我们自底向上贪心,每个点记录最大深度,一旦发现 \(\ge K\) 之后就调整整颗子树,这样最优。

树上划分,延迟决策给父亲,到最优的时刻进行处理

E

相对运动

所有人遵循同样的移动指令,等价于所有人相对位置不变,等价于出口遵循相反的移动指令。

所以从出口移动的角度来看,出口向左移动,等价于所有人向右移动,同时最右边一列的人全部挂掉。

影响挂人的条件只有出口的移动轨迹里,\(x_{\max},x_{\min},y_{\max},y_{\min}\)

注意到 \(N\le 100\),可以将其作为四个维度暴力DP。

转移时候枚举四个维度 \(+1\),然后将增加的矩形范围里面的人个数算上即可。

	for(int i=0;i<sx;++i)for(int j=0;j<=n-sx;++j)for(int k=0;k<sy;++k)for(int l=0;l<=m-sy;++l){
        int &w=f[i][j][k][l];
        if(i+j<sx-1)chk(f[i+1][j][k][l],w+sh[sx-i-1][Min(sy+l,m-k)]-sh[sx-i-1][Max(sy-k-1,l)]);
        if(i+j<n-sx)chk(f[i][j+1][k][l],w+sh[sx+j+1][Min(sy+l,m-k)]-sh[sx+j+1][Max(sy-k-1,l)]);
        if(k+l<sy-1)chk(f[i][j][k+1][l],w+sr[Min(sx+j,n-i)][sy-k-1]-sr[Max(sx-i-1,j)][sy-k-1]);
        if(k+l<m-sy)chk(f[i][j][k][l+1],w+sr[Min(sx+j,n-i)][sy+l+1]-sr[Max(sx-i-1,j)][sy+l+1]);
        res=Max(res,f[i][j][k][l]);
    }

F

读题\(N-1\le M\le N\),连通图

这玩意是基环树题。

先考虑树的情况,再考虑环的影响。

类似于 CF1615F 一样,同色 实际上可以转化为 异色

将树黑白染色后,问题就变成了:给定每个点的颜色,每次可以交换两个点的颜色,求使得所有点最终颜色与开始不同的最少操作次数。

经典模型

将黑色看作 \(1\),白色看作 \(-1\),则点权和必须为 \(0\),否则无解。

设子树点权和为 \(s_i\),我们考虑计算每条边的使用次数。则对于点 \(u\) 的儿子 \((v_1\sim v_m)\) 而言,每个 \(s_{v_i}\) 都意味着其至少操作 \((u,v_i)\) \(|s_{v_i}|\) 次,所以可以得到一个下界是 \(\sum_{i=1}^n|s_i|\)

我们考虑每次把根节点的颜色变化之后(\(s_i<0\) 的时候为白色,反之同理),操作这条边,操作了 \(s_{v_i}\) 次之后子树内就平衡了,是一个子问题,就可以取到下界

所以树的情况可以解决。

考虑非树的情况。

考虑将一条环边提前操作 \(k\) 次。

  • 偶环树

    这时候不会引起黑白点数变化,考虑断掉边后剩下的路径,不妨设左边是白点,左侧路径的和会增加 \(k\),因为将 \(k\) 个白点变成了黑点,右侧是减少 \(k\)。 那么也就是 \(|k|+\sum|sl_i+k|+\sum |sr_i-k|=|0-k|+\sum |-sl_i-k|+\sum |sr_i-k|\)

    取中位数计算即可。注意黑白点个数相同。

  • 奇环树

    这时候会引起黑白点数偶数性变化,所以黑点个数白点个数奇偶性相同,虽然没用 \(n\bmod 2=0\) 就是了。

    所以考虑点权总和是 \(S\),那么断掉的边显然需要操作 \(\frac{|S|}{2}\) 次,随便选一条,给其端点的权值减掉 \(\frac{S}{2}\) 按照树计算即可。

AGC005

A

栈模拟即可

B

单调栈模版

C

首先找必要。考虑树的直径,$\max $ 至少有两个。

  • \(\max \bmod 2=1\) 最小值有且只有两个,且 \(2\min-1=\max\)
  • \(\max\bmod 2=0\) 最小值有且只有一个,且 \(2\min=\max\)

然后考虑连续性。

  • 排序后 \(\forall i\in [2,n],a_i-a_{i-1}\le 1\),如果 \(\ge 2\),那就不连续了(直径必然是连续的)

然后考虑充分性,上面条件可以保证存在一条直径。

而更简单的,对于其他 \(a_i\)(非最小值),都可以在直径上找到一个为 \(a_{i}-1\) 的位置,然后变成这个位置的儿子即可。

D

考虑容斥,设 \(f_i\) 为钦定了 \(i\) 个位置非法的所有方案数,则有 \(ans=\sum_{i=0}^n(-1)^if_i\)。注意这里选法不考虑。

那么 \(f_i=(n-i)·g_i\) \(g_i\) 为仅仅给 \(i\) 个钦定的位置指定值的方案数。

注意到将位置与值看作一张二分图,矛盾关系看作边,则就变成了恰好指定 \(k\) 条边,且每个顶点最多对应一条边。

而容易发现图由 X 形组成,\((i,i+2k,i+4k)-(i+k,i+3k……)\) 进行匹配(左部和右部)

注意图是对称的,我们枚举起点 \(i\in [1,k]\),可以轻易算出链的长度。

\(dp_{i,j,0/1}\) 为长为 \(i\) 的链,选出 \(j\) 条边,最后一个选或不选的方案数,跟独立集一样DP就行了,

所以将所有的 \(dp_{len_i}\) 卷起来即可。注意由于对称要卷两边。

复杂度 \(O(nk\frac{n}{k})=O(n^2)\)

E

妙妙博弈论。

考虑什么时候无限大。

直觉告诉我们,对于树 \(A\) 上的边 \((u,v)\) ,如果在 \(B\) 上很远,那么我们可以停在 \(u\),当后手与 \(u\) 相邻之后又跳到 \(v\),这样反复横跳可以达成无限大的目标。

仔细推推就是 \(dis_B(u,v)\ge 3\),这里指边数。

将满足这样的条件的 \(u,v\) 做标记 \(ok_u=ok_v=1\)

只要可以先于后手走到这样的点,并且后手在先手行动之后走不到,那就可以无限大。

否则考虑能怎么办。

如果不是这样,那么在先手走一定次数后就会停下来等死。因为其再走是无意义的。

不妨设 \(da_i,db_i\) 为点 \(i\) 在树 \(A/B\) 上与 \(x/y\) 的距离,从零开始,则从 \(x\) 开始,每次走 \(da_i<db_i\) 的点,所能够走到的所有点就是可以先于后手走到的点,其中有点 \(ok_i=1\) 就是 \(-1\),否则答案就是 \(2\max(db_i)\)

考虑极端情况,手玩

F

显然考虑每条边的贡献,由于树上连通块,边数是点数减去一,最后 \(ans_i\) 加上 \({n\choose i}\) 即可,设 \(s_i\) 为这个边对应子树大小,则有对于 \(ans_j\) 来说,贡献是 \(\sum_{x=1}^{x<j}{s_i\choose x}{n-s_i\choose j-x}\),用范德蒙德卷积合并一下就是 \({n\choose x}-{s_i\choose x}-{n-s_i\choose x}\),其实根据容斥原理也可以得到相应结论。

\(s_{i+n}=n-s_i\),这样把 \(s\) 的长度扩为两倍,有:

\[ans_j={n\choose j}+\sum_{i=1}^n{n\choose j}-{s_i\choose j}-{s_{i+n}\choose j}=(n+1){n\choose j}-\sum_{i=1}^{2n}{s_i\choose j} \]

前者可以拿出来,问题变为计算 \(f_j=\sum_{i=1}^{2n}{s_i\choose j}\)

考虑 GF,有:

\[\begin{aligned} F(z)&=\sum_{j}f_{j}j!z^j\\ &=\sum_{j}z^j\sum_{i=1}^{2n}\frac{s_i!}{(s_i-j)!}\\ \end{aligned} \]

后面是个差卷积,具体地,设 \(G(z)=\sum z^ii!\),设 \(Q(z)=\sum_{i}\frac{z^i\sum_{j=1}^{2n}[s_j=i]}{(n-i)!}\)

\(G(z)\times Q(z)=F(z)z^n\)

组合数计算,考虑拿出定值,然后是个差卷积,可以直接卷

AGC006

A

暴力枚举即可,当然也是Z函数模板。

B

构造是简单的,我们考虑怎么保留一个数。

容易发现这个操作会使得相邻数字值域更为接近,也就是 \((x,x-1)\) 在没有两个都被踢掉之前是 \((x,x),(x-1,x-1),(x,x-1)\) 三种情况之一。

自然的想法是插入 \(x-1,x,x+1\),而我们声称将 \((x-1,x,x+1)\) 放在正中间就可以解决问题。

可以分讨,假设 \((i,x-1,x,x+1,j)\),由于 \((i,x-1,x)\),其不可能保留 \(i\),而 \((x,x+1,j)\) 也不可能保留 \(j\)。而保留 \(x-1,x\) 哪一个是无所谓的,始终保证三个数值域相邻。

所以 \(x=1\),\(x=2n-1\) 是无解。

C

这是紫题

对称,也就是 \(a_i\to 2x-a_{i}\),根据期望的线性性,有 \(E'(i)=2E(x)-E(i)\)

再加上概率,容易知道 \(E'(i)=\frac{1}{2}(2E(i-1)+2E(i+1)-2E(i))=E(i+1)+E(i-1)-E(i)\)

考虑式子的形式很差分,所以维护 \(f_i=E(i)-E(i-1)\),则带入式子有 \(f'_i=E'(i)-E(i-1)=E(i+1)-E(i),f'_{i+1}=E(i+1)-E'(i)=E(i)-E(i-1)\)

这相当于是交换了 \(f_i,f_{i+1}\)

所以我们考虑记录一轮后位置 \(i\) 最终是原本的哪个位置,记作 \(p_i\)

一方面这等价于是在环上跳步,一方面每个元素独立,一方面每次操作神似,所以可以考虑倍增,设 \(pos_{i,j}\) 为跳了 \(2^j\) 次后的位置,显然有 \(pos_{i,j}=pos_{pos_{i,j-1},j-1},pos_{i,0}=p_i\),所以直接倍增算就好了。

D

感觉D>F

模拟直接死。

考虑某题的思路,判断最终位置是否 \(\ge x\),二分答案求解。

那么就是对于位置 \(x\),如果下一层的 \(x-1,x+1,x\) 中至少存在两个 \(1\) 则为 \(1\)

那么可以发现对于 \(11\) 而言可以一直往上传,直到因为边界限制死掉。\(00\) 同理。

然后我们再考虑 \(1010101\) 这种情况,如果在中间插一个 \(11\),变成 \(10110101\) 这类东西,容易发现 “11” 会“感染”。每次上传会把两侧的 \(0\) 变成 \(1\)

所以我们可以得到,离中心位置越近的 \(11\) 或者 \(00\) 决定了中心位置的数值。因为一旦感染了中心位置,则与其相邻位置会变成 \(00/11\) 保持到最后。(注意感染的速度一定不慢于清除边界的速度)

当然不可能存在两段距离一样,因为是奇数距离。

当然也有一种情况可能不存在 \(11/00\) 段,他就是 \(10101010101\) 或者 \(01010101010\)

手玩可以发现这取决于第一个位置的值,因为每一层会变成类似结构,最终边界逼近到中心位置。

综上,我们考虑从中心位置开始向两边扩展,第一个遇到的 \(11/00\) 决定最终值,如果没有遇到那么就由边界值决定(其实也是中心值的相反值)。

三个数的 \(01\) 串可以枚举每种情况手摸

E

遇到操作题,或许可以通过暴搜验证一些操作的性质,当然最好用迭代加深免得自己看不懂

首先判掉一些很智的错误,比如出现相同值,比如值域越界。然后注意到每一列的元素不变,始终是 \(3x+1,3x+2,3x+3\) 构成一列,且 \(3x+2\) 居中。把这个也判掉。

那么我们就只需要看中间一行的操作了。

考虑这时候每一列有是否翻转过两种状态,可以用中间数的正负来体现,当然新开一维描述也没啥问题。

考虑把中间一行写成排列(\(x\to (x+1)/3\)),这样的就等效于以下问题:

给定 \([1,2,3……n]\),每次操作可以选择一个位置 \(i\in [2,n-1]\),交换 \(i-1,i+1\) 位置上的数,并且将 \(i-1,i,i+1\) 三个位置上的数都变为相反数,问能否得到数列 \(p\)

先不考虑正负,类似 AGC003C,容易发现每次交换,每个数的位置的奇偶性不变,所以若存在 \(i\),使得 \(p_i\bmod 2\neq i \bmod 2\),则非法。

然后考虑将奇数位置和偶数位置分别排好序,这是奇数位的逆序对数和偶数位的逆序对数。

接着不难发现,对奇数位进行一次操作,那么偶数位的负数个数奇偶性仍然不变,偶数位逆序对数奇偶性变化,奇数位负数个数奇偶性变化。偶数位操作同理。

所以奇数位操作次数奇偶性与奇数位负数个数相同,而奇数位操作次数等价于偶数位逆序对数。

这也是一个必要条件。

逆序对数奇偶性等于 \(n\) 减去置换环个数的奇偶性

写完之后发现能过。

考虑证明这个结论。

我们可以通过若干次操作只改变相邻两个数的正负性。这样的话我们通过奇偶都排好序之后看奇数位的负数个数与偶数位上的负数个数都是偶数个就行了(显然等价于之前的结论)。

abcde

CBAde

CBEDa

ebcDa

ebAdC

aBEdC

aBcDe

adCbe

cDAbe

cBade

AbCde

F

显然有图论建模:\(x\to y,y\to z\implies z\to x\)

相当于构筑了三元环。

特殊情形开始考虑

自环:\(x\to x,x\to y\implies y\to x,y\to x,x\to x\implies x\to y\)。产生二元环。

二元环:\(x\to y,y\to x\implies x\to x,y\to x,x\to y\implies y\to y\),产生两个自环,并且若有 \(y\to z\),类似的会导致 \(y,z\) 变成二元环,而 \(z\) 出现自环,然后导致 \(xz\) 变成二元环。

三元环:不变

四元环衍生二元环

五元环衍生四元环

六元环被剖成若干三元环

七元环产生五元环……。

我们可以知道:

  • 对于 \(k\bmod 3\neq 0\) 的环,最终都会 \(\forall x,y,x\to y\),也就是 \(k^2\) 条边。

  • 对于这样的环,外接任何一个点(无论是写入还是写出)都会被“同化”

  • 对上个结论数学归纳,也就是对于一个弱连通图,若存在一个非三的倍数的环,则整个图两两之间有边(有自环)。

判断三的倍数的环,容易想到三染色。(也就是对于边 \(x\to y\),赋权 \(1\),同时建立反向边 \(y\to x\) 赋权 \(2\),然后染色 \(\bmod 3\)(弱连通图染色,建立反边,赋相应边权)。

如果染色矛盾,说明整个弱连通图会变成两两有边。边数是 \(siz^2\)

如果只用两种颜色,说明不存在长为三的链 \(x\to y,y\to x\)。不能进行操作。边数是原边数。

如果三个颜色都用了,通过三元环,六元环,可以猜出最后所有 \(0\) 点向 \(1\) 点有边,\(1\) 点向 \(2\) 点有边,\(2\) 点向 \(0\) 点有边,边数是 \(cnt_0·cnt_1+cnt_1·cnt_2+cnt_2·cnt_0\)

对每个弱连通图加起来即可。

AGC007

A

显然有且仅有 \(n+m-1\) 个格子是 #,并且将格子按照 \(x\) 为第一关键字,\(y\) 为第二关键字排序后,满足对于 \(x,y\) 单调不增,且相邻两个点曼哈顿距离为一,最后 \((1,1),(n,m)\) 都是 # 即可。

B

这题能蓝

显然我们先考虑构造 \(a+b\) 这个数列,容易想到它的偏序关系不会影响 \(a,b\) 的偏序关系,那么就可以令 \(a_{p_i}+b_{p_i}=n(n+2)+i-1\)

同时让 \(b_i=n(n-i)+n\),这样 \(a\) 自然满足偏序关系。因为比较 \(a\) 的时候比较其 \(\lfloor\frac{a_i}{n}\rfloor\) 时大小关系已经确定。

C

诡异的期望题。

\(2n+1\) 个物品,其中奇数位的是沙坑,偶数位的是球。第 \(i\) 个和 \(i+1\) 个之间的距离是 \(d_1+x(i-1)\)

考虑到将整个序列翻转,那么就有原始序列往左走和这个往右走等价,而最终答案同样相同,而这样操作之后,一段距离就变成了 \(d_1+(2n-1)x\),所有距离相同(等差数列求和思想)。所以将我们将答案除以 \(\frac{2d_1+(2n-1)}{2}\) 后,就变成了每一段距离都是 \(1\),各个坐标是 \(1,2,3……2n+1\) 的问题。

我们将一个球推入沙坑,视作把土给埋了,那就相当于合并了三段距离。

将距离看作元素,转化为:给定 \(2n\) 个数,起初都是 \(1\),每次可以进行如下操作:

  • 将前两个数删去,或者将最后两个数删去
  • 找一个非最前最后的位置,合并三个数

所求为每一次操作位置的元素的期望和。

考虑每次选一个元素进行操作,而最初值相同,每个值被选中概率相同,所以进行了若干轮操作后剩下的所有数期望相同(进行操作一不影响值,进行操作二又有每个值都同等概率进行)。

不妨设 \(d_i\)\(i\) 轮后每个元素期望值,设 \(sur=n-i+1\),也就是操作前剩下的球数,考虑操作前总和为 \(2sur·d_{i-1}\),操作后的期望是 \(\frac{2sur-2}{2sur}2sur·d_{i-1}+\frac{2}{2sur}((2sur-2)·d_{i-1})=\frac{sur+1}{sur}d_{i-1}·(2sur-2)\),剩下了 \(2sur-2\) 个,取平均数得到 \(d_i=\frac{sur+1}{sur}d_{i-1}\)

答案即为:\(\frac{2d_1+(2n-1)x}{2}\sum_{i}d_i\) 每次取 \(d_i\) 进行操作。

D

由于 \(T\) 固定,显然对 \(x\) 排序后就是一个分段问题,对于每一段 \((l_i,r_i)\) 我们先走过去一趟,然后给小熊糖果,接着走回来,等第一个小熊产生金币,然后依次走过去,由于相对时间都是 \(T\),所以走到后面的小熊的时候也一定产生了金币。

这样的话,我们可以先拿走整个走第一次的距离 \(E\),对于一段的代价可以写成 \(\max(T,2(x_r-x_l))\)

则有设 \(f_i\) 为拿完前 \(i\) 个熊的金币的最小代价,有: \(f_i=\min_{j<i}\lbrace f_j+\max(T,2(x_i-x_{j+1}))\rbrace\)

显然,我们有 \(f_{i}\ge f_{i-1}\),所以可以双指针维护第一个 \(j\) 满足 \(2(x_i-x_{j+1})\le T\),这样的话可以用 \(j\) 更新答案,其次 \(j'\in [0,j-1]\) 的时候,我们维护 \(f_{j'}-2x_{j'+1}\) 的最小值即可。

\(O(n)\)

E

最大的最小,容易想到二分答案。

而题目所要求的路径,其实就是各个子树里面自己解决,是一个递归结构。

也就是我们只需要在一个点决定先进入左子树还是先进入右子树。要求子树合并时前一个的最后点到后一个的第一个点距离不超过 \(mid\)

一个合理的想法是做一个 DP,设 \(f_{a,b}\) 是第一个走到叶子 \(a\),最后一个走到叶子 \(b\) 是否可行,那么有 \(f_{a,b}=1\) 不妨设 \(a\) 位于左子树, \(b\) 位于右子树,也就是存在 \(p,q\) 满足 \(f_{lc,a,p}=1,f_{rc,q,b}=1,dis(p,q)\le mid\)

可以做到 \(O(n^2)\)

逐步优化,我们注意到 \(lca(p,q)\) 是当前点,而且只关心路径长度,所以不妨将 \(a,b\) 换为到第一个叶子长度为 \(a\),到最后一个叶子长度为 \(b\)

这样的话,可以想到对于每个 \(b\) 维护可行的最小的 \(a\),不过这样反过来也不好操作。

进一步可以想到若 \(a\le b,c\le d\),则 \((a,c)\) “支配” 了 \((c,d)\),所以维护这些支配对 \((a,b)\) 即可

满足性质:\(a\) 严格递增时,\(b\) 严格递减。所以可以按 \(a\) 排序。

如何?我们枚举先走左子树还是先走右子树,设左右边权分别是 \(wl,wr\),以左子树为例:

左子树 \((a,b)\) 与右子树 \((c,d)\) 合并,有 \(b+d+wl+wr\le mid\) 即可,合法的 \((c,d)\) 在右子树中是一个前缀,且取最后一个显然可以满足 \(d\) 最小,这样最优。

反过来也是一样,这样我们得到了先走左子树和先走右子树两个决策集合 \(tmpl,tmpr\)

显然两个集合也满足 \(a\) 递增 \(b\) 递减,所以可以直接归并合并两个集合,按照 \(a\) 递增归并,而若不满足 \(b\) 递减性质,则不加入。

容易发现,因为 \(a,b\) 分属两个子树,且每个 \(a\) 互不相同,每个 \(b\) 互不相同,所以至多有 \(\min(siz(lc),siz(rc))\) 个决策(\(a\) 取完较小子树,然后 \(b\) 取完较小子树)。

由启发式合并可知复杂度为 \(O(n\log n)\) 加上二分复杂度 \(O(n\log^2 n)\)

感觉挺自然,没必要评黑

启发式合并维护支配点对/具有单调性的最优决策序列,类似题还有 UOJ快乐游戏鸡。

具有单调性的可行性问题可以转化为最优化问题

F

这种匹配可行性基本都是从后往前贪心,这样没有后效性

而我们考虑原序列的每个字符都对应了最后序列的一个区间(如果用上)。

考虑把整个变化过程写成一个矩阵,并且将每个字符染上不同颜色。

像这样:

容易发现对于一条新的路径,我们尽可能与上一条路径贴合最优。因为 \(y\) 坐标每增加一其实是拐点(向右)增加了一。

所以答案就是整个图最大连续(左下斜线)的右拐点个数。其实也是纵坐标。

考虑一个路径的拐点,与上一条路径贴和的话,就是上一个拐点的左下的点是当前路径的拐点。

所以可以存下每个拐点的路径起始位置 \(x\),用队列维护拐点,假设其当前已经往左下走了 \(k\) 次,那么其坐标就是 \((x-k,k)\)

每一次添加一条新路径时,那些 \(x\) 大于对应区间左端点的拐点会全部删掉。设 \(j\) 为原序列 \(j\) 位置与结果序列区间匹配,这个区间左端点是 \(i\),需要有 \(j\le i\)while(h<=t&&q[h]+h-t>i)++h;

所以这条路径的拐点会由剩下的原本拐点向左下走一步更新,而新拐点就从匹配位置起始(原序列的位置,这个位置向下走一步就开始右拐,这就是最上面的那个拐点)。q[++t]=j;

不难发现更新次数与当前拐点是队列里第几个对应(在之后插入了多少个拐点)。if(j!=i)ans=max(ans,h-t+2),这是因为自带一个拐点,要特判掉直接往下走的情况。

AGC008

A

显然只有四种决策,枚举 \(x,y\) 是否取负,依次判断即可。

B

玩一玩可以发现所有存在连续的长度为 \(k\) 的同色段的局面都是可以达到的。

所以可以枚举最后一段的位置 \(i,i\ge k\),让 \([1,i-k],[i+1,n]\) 全部取正数,枚举这一段全取或者全不取即可。

C‘

显然第三类,第六类,第七类方块非法,第二类方块独立,不妨设个数均为 \(a,b,c,d,e,f,g\),则只需要考虑第一类,第四类,第五类方块即可。

两种决策,要么两个自己叠,要么三个各取一个可以叠出来。

而存在最优局面,至多有一个块是三类方块各一个拼成的,因为用了偶数个的话可以被替代掉。

D

显然先把所有数字先放进答案数组里,然后按 \(x\) 排序。

一方面,我们显然优先从小到大放 \(x\) 小的数的前半部分数,放完之后放 \(x\) 从大到小的数的后半部分。

一方面,前半部分数尽可能往前放,这样让 \(x\) 更大的数的可以填的位置尽可能消耗得少,而且对填后半部分时影响最小。

一方面,后半部分数尽可能也是尽可能往前放,从 \(x_i+1\) 开始。同理。

E

个人感觉比 \(F\) 更难一些。

首先可以想到建立基环树森林,然后考虑到本质上操作是保留这个基环树森林的边,或者是将一条边里面插一个点进去,要求得到的排列的置换环里面 \(i\) 走一步或者两步可以到达 \(a_i\)

我们分基环树和环来讨论

对于基环树的情况,手玩可以发现去掉环边之后必须是一条条链(包括单点)。因为一条链在满足限制的情况下,只能依次插在 \(pre_{top}\to top\) ,以及依次 \(pre_{pre_{top}}\to pre_{top}\) 的边里面,亦或者从 \(pre_{pre_{top}}\to pre_{top}\) 的边里面插进去。

而且又由于插了之后限制存在,所以只能是环点,链点,环点,链点这样交错着来。

所以有两条及以上的链一定是无解的。 而对于链插进去的情况,其实等价于在 \([top-len,top-1]\) 这些环点前面依次插进去,亦或者插 \([top-len-1,top-2]\)。但是需要注意一条边最多插一个点进去,而且即使选择了 \([top-len-1,top-2]\)\(top-1\to top\) 还是不能插点进去,所以问题转化为区间覆盖问题,每个 \(len>0\) 的环点提出覆盖这两个区间的限制,至少满足一个,求方案数,显然可以 DP。

破环为链后可以直接记录前面还有多少个位置可以插,记为 \(c\),若 \(len>0\),则 \(c<len\) 时就无解了,否则 \(c=len\) 的时候刚好插,\(c>len\) 时两个都可以。然后清空 \(c\)

接着我们讨论环的情况。

显然对于两个等大的环,可以选择一个位置,像基环树那样依次插进去。

对于一个奇环(非自环),例如 \(a\to b\to c\to b\),真实情况也可能是 \(a\to c\to b\)

那么就有几种决策:

  • 对于两个等大的环,可以合并,方案数是 \(siz\)
  • 对于一个大于 \(1\) 的奇环,可以交错,可以保留,方案数是 \(2\)
  • 对于一个偶环,如果不合并,那么只能保留

而基环树由于插了点,不可能与环合并。三种决策都说明可以把环按照大小分类。

所以可以把大小都是 \(siz\) 的环一起处理,假设有 \(c\) 个,那么可以进行动态规划。

\(f_{i}\)\(i\) 个环处理后总方案数,设 \(p=[siz\bmod 2=1,siz>1]+1\),则 \(f_0=1,f_1=p,f_i=f_{i-1}·p+f_{i-2}·siz·(i-1)\)。其含义为第 \(i\) 个环保留,或者第 \(i\) 个环找一个配对环,剩下的 \(i-2\) 个环就是子问题。

\(f_{c}\) 即为所求。

最后把所有方案乘起来就行了

F

先**考虑全是特殊点的情况****

一个什么样的连通块唯一?

对于决策 \((v,d)\),所有黑色点中存在两个点,满足与其直接相连的点中有白色点即可

这样就相当于 \(v\) 是这个路径的中心,任意偏离都会导致不同状态。

这是充分的,能否必要?

如果假设只有一个黑色点与外界连通,那么还需要一个黑色点,满足这两个点到 \(v\) 的路径长度相同

总的来说就是存在一条极长的路径,满足 \(v\) 是中点,且与外界相连,当然判掉全图的情况。

如果不是这样一定可以?

首先无连通的情况显然是全图,已经判掉

其次那就是仅有一个黑色点与外界连通,且不存在一个另外黑色点与其到 \(v\) 路径长度差不超过 \(1\),那么 \(v\) 就可以往远离它的方向偏移,然后增加 \(d\),这样局面相同。(如果相差一偏移之后是会出问题的(这时候“直径”长度是奇数,相差二,三都可以在偏移后用更小的 \(d\) 做到)

我们考虑对于每个局面在 \(d\) 最小的时候进行记录,这样的话一定不重不漏(直径中点唯一)

总的来说就是 \(d\)\([0,cdis+1]\) 都是可以的。

但是有可能 \(dis=cdis+1\),这时候 \(cdis+1\) 就不能取了,因为全局了需要排掉。

所以就是 \([0,min(dis-1,cdis+1)]\)。(边界情况小心处理

如果不是?

关键点减少,那么就只用考虑减少的局面数

显然上界不变,只有下界变化

还是考虑中点理论,那么它能够成为中点必须要有与其最近的关键点能够覆盖到他,或者说它能够覆盖一个完全的关键点的方向的点且自身为中点

一方面关键点的答案不变

二方面对于非关键点为中心的情况,就是关键点覆盖了整个子树然后再传两倍给祖先使得祖先成为中点

如果自身不是关键点,那么对于 \(d\) 大于等于 “关键” 子树里的最远路径里的最小值,这个关键子树就会被完全覆盖,传两倍就会使得它是中点。

不妨设这个值为 \(d\),对于关键点来说 \(d\) 是零。

换根求出 \(dis,cdis,d\) 之后,答案就是 \(1+\sum_{i=1}^n \max(0,\min(dis_i,cdis_i+2)-d_i)\)

AGC009

罕见只有五题。

A

显然考虑到最终 \(A_i\bmod B_i=0\),所以可以算出 \(c_i\) 表示在最少增加 \(c_i\) 次之后就可以满足条件。

那么可行的增加次数就是 \(c_i+k·B_i\),而题目等价于是求一个首项最小的单调不增序列 \(C\),满足 \(A_i+C_i\bmod B_i=0\)

其实很简单,二分这个首项,那么每次我们按照要求将值变为最大的 \(c_i+k·B_i\),如果遇到了当前值小于 \(c_i\) 就无解。

B

题意实际上是要你设计一个锦标赛结构,使得深度最大值最小。

显然将失败者作为战胜者的儿子,连边建树

可以考虑设 \(f_i\) 为子树 \(i\) 最大的深度的最小值。

显然在加入一个 \(son\) 进来的时候,需要考虑将两个点作为锦标赛结构的左右子树,那么显然有 \(f'_i=\max(f_i+1,f_{son}+1)\)

显然将 \(f_{son}\) 从小到大排序后依次更新最优。

C

zzDP题

可以想到设 \(f_{i,0/1,0/1}\) 为节点 \(i\),是否与 \(i-1\) 处于同一集合,位于集合 \(X/Y\)。显然先将 \(a\) 排序。

那么根据定义初始化 \(f_{1,0,0}=f_{1,0,1}=1\)

转移的时候,显然有:

  • \(f_{i,1,1}=f_{i-1,0,1}+f_{i-1,1,1}\)
  • \(f_{i,1,0}=f_{i-1,0,0}+f_{i-1,1,0}\)
  • \(f_{i,0,0}=\sum f_{j,0,1}\),其中 \(j\) 要满足:\([j,i-1]\) 全部放 \(B\) 是可行的,且 \(a_{i}-a_{j-1}\ge A\)
  • \(f_{i,0,1}\) 同理 \(f_{i,0,0}\)。容易发现 \(j\) 的取值是一段区间,用前缀和优化即可。

D

题意就是要求构造一颗原树的点分树,要求最大深度最小,求这个最小的最大深度。

不妨模仿求直径,我们设 \(d_i\) 为最优点分树里,到 \(i\) 的最长链长度。答案就是最大的 \(d_i\)

那么根据点分树的性质:两点 \(LCA\) 必然在点分树路径上,点分树 \(LCA\) 必然在两点原树路径上

可以得出一个必要条件:\(\forall i,j,d_i=d_j\) 则必然存在 \(x\)\(d_x>d_i\)\(x\) 在原树两点路径上

同时我们说明这是充分的。

考虑每次取出最大 \(d\),以它为根,删除它,递归处理剩下的连通块,由上述性质得到每个连通块里面最大的 \(d\) 唯一且都小于这个 \(d\)

如果某个连通块存在两个最大的 \(d\),那么整体的最大 \(d\) 不在其路径上,矛盾。如果某个连通块的最大 \(d\) 等于这个最大 \(d\),跟唯一性矛盾。我们说明了每个连通块有相同性质,递归构造即可。

所以这个条件充要。

那么问题就变成了我们给所有点分配点权,使得最大的点权最小,且满足任意两个相同点权,路径上必然有点点权大于它们。

不妨考虑状压 \(dp\)

\(f_{u,S}\) 为子树 \(u\) 里,有集合 \(S\) 的点权都出现了,且尚未解决(也就是尚未满足有一个点权大于它们,显然这是惟一出现)。

那么对于 \(d_u\) 的取值,也就是首先不能取各个子树的 \(S\) 里面有过的元素,且必须大于两个 \(v\) 共有元素的最大值。

从这里我们可以发现,对于每个值,取能取的最小值没有后效性,且一定最优。

所以我们不妨设 \(s_u\) 为按照以上贪心策略,子树 \(u\) 出现过的且还没有解决的点权集合。

因此我们任意钦定一个根,贪心的由叶子向根构造即可(原本是叶子在点分树上一定也是叶子,因为只有一个方向)。

那么可以求出 \(t=|_{i\neq j}s_{v_i}\& s_{v_j}\),这是容易计算的(保留 \(| v_i\) 的前缀和即可),求出 \(w=| s_{v_i}\)

则我们所求的 \(k\),必须大于 \(t\) 的最高位,且没有在 \(w\) 中出现过,可以利用 builtin 系列函数做到 \(O(1)\)。(取出 \(t\) 的最高位 \(k\),然后将 \(w\)\([0,k]\) 全部变成 \(1\),接着再取 \(w\) 的第一个 \(0\) 即可)

根据点分治的知识我们知道答案不超过 \(O(\log n)\) 用个 unsigned int 的数状压即可。

将最优化问题变成树上赋权问题,这很妙啊

E

每次合并 \(k\) 个元素,则合并过程构成 \(k\) 叉树结构,可以直接计算叶子对根的贡献

掌握常见角度“带限制”与“不带限制”之间的转化,可以互转,强化/弱化

显然每次减少 \(k-1\) 个数,所以在 \((n+m-1)/(k-1)\) 轮后只剩下一个数,不妨令这个值是 \(d\)

考虑这个贡献过程本质上是一颗 \(k\) 叉树,有 \(n+m\) 个叶子,非叶子节点的值都是儿子的平均数,根节点值即为所求。

那么根节点值就是 \(\sum_{i=1}^m k^{-dep_i}\),也就是所有 \(1\) 的深度。

一组什么样的 \(dep\) 是合法的?

一个必要假设所有叶子都是 \(1\),那么根也是 \(1\) ,也就给出了 \(\sum k^{-dep_i} =1\)假设极端情况找必要条件

充分吗?

如果满足,可以将所有数字乘以 \(k^d\),写作 \(k\) 进制数,不断进位,因为和的缘故必然可以解决。所以充分。

所以考虑本质上就是求有多少个 \(x\),可以写作 \(m\)\(k^{-dep_i}\) 的和,且剩下的 \(n\) 个叶子的 \(dep\) 与这 \(m\)\(dep\) 满足 \(\sum k^{-dep_i} = 1\)

我们考虑在轮数为 \(d\) 的情况下,任何一种 \(m\)\(1\) 的取值都是可以构造出合法的 \(0\) 的取值的。

其实很简单,把这些 \(1\) 的深度合起来,写成一个 \(k\) 进制数,然后调整,调整之后将不为 \(k-1\) 的位塞 \(0\),这一定是够的。

然后再把最后位塞 \(0\),这样就可以合并了,因为 \(n+m-1\bmod (k-1)=0\),所以必然可以构造成功(将一些 “0” 换成 \(k\) 个)

当然其实可以反过来考虑,一个符合要求的形态,钦定某些位置是 \(1\) 即可。

现在的问题还是很复杂,一个合理的想法是我们设 \(dp_{i,j}\) 为前 \(i\) 层一共用了 \(j\) 个一的方案数进行DP。

但是会出现第 \(i\) 层一个 \(1\) 相当于 \(k\)\(i+1\) 层的问题。

所以不妨转化一下问题,我们把同层的 \(k\)\(1\) 直接往前合并,也即对答案的 “\(k\) 进制数” 进行DP。

\(f_{i,j}\) 为前 \(i\) 位,用了 \(j\)\(1\) 的方案数,有:

  • \(f_{0,0}=1\)
  • \(f_{i,j}=\sum_{t=\max(0,j-k+1)}^{j}f_{i-1,t}\)

前缀和优化 DP 即可。

同时我们算答案的时候枚举一共有多少个同层 \(k\) 合并为了 \(1\),假设 \(x\),那么个数就变成了 \(m-(k-1)x\),轮数就变成了 \(d-x\),所以答案是 \(\sum^{(k-1)x\le m} f_{d-x,m-(k-1)x}\)

AGC010

A

容易发现奇数个数的奇偶性不变,所以有奇数个奇数就无解。

不然先把所有奇数变成偶数,然后每次就会减少一个偶数。

B

考虑我们可以得到 \(t=\frac{2\sum a_i}{n(n+1)}\) 为总的操作次数。

然后考虑做一个环形的差分(\(c_1=a_1-a_n,c_i=a_i-a_{i-1}(i\ge 2)\)),每次操作相当于全部减一,然后有一个位置加上 \(n-1\)

所以我们算出这个之后先把每个 \(c\) 减去 \(t\),这样就相当于要进行 \(t\) 次操作,每次选中一个位置增加 \(n\) 问是否可能把所有数字变为 \(0\),显然判断每个数字是否都是非正整数,且模 \(n\) 为零,总和是 \(-nt\)

C

充分利用已知信息列方程

容易想到设 \(f_i\) 为子树 \(i\) 合并完了之后向上传的链的条数,设 \(s_i\) 为子节点的 \(f\) 之和。

则有:\(f_i+c=a_i,2c+f_i=s_i\),其中 \(c\) 是在点 \(i\) 进行合并的次数。

可以解出 \(f_i,c\),我们检验其是否合法即可。设 \(mx\) 为子节点 \(f\) 最大值,则最大匹配次数 \(t=\min(s_i-mx,\frac{s_i}{2})\)

显然有:\(0\le f_i\le \min(s_i,a_i),a_i-f_i\le t,2a_i\ge s\)

判断即可。

D

首先容易发现如果原序列有了 \(1\) 那么胜负就已经确定了(看总和的奇偶性,也即奇数个数的奇偶性)。

以下讨论均在原序列没有 \(1\) 的情况下进行。

考虑到原序列 \(\gcd =1\) 则必然存在一个奇数。

而我们只需要保证序列始终存在一个奇数,则除以全局 \(\gcd\) 不会影响数字奇偶性

考虑先手把一个偶数变成奇数,则后手无论操作偶数还是奇数,先手都可以保证偶数个数奇偶性不变(因为所有数字奇偶性不变)。

所以这样操作之后,有偶数个偶数后手就必败了。

所以一个必胜的充分条件是 原序列有奇数个偶数

考虑如果只有偶数个偶数?

先手如果操作了偶数,那么必败(后手反转)。

如果有两个及其以上奇数,先手操作奇数也必败。

而如果仅有一个奇数,先手操作之后结局未知。其他操作全部必败。

所以我们将这个奇数操作,就变成了同类子问题,递归解决即可。\(O(n\log V)\)

E

可以模仿 AGC001 F 的思路,容易发现最后两个不互质的数相对位置不变

那么对于先手而言,他需要指定不互质的数的相对位置,使得字典序最小且后手无法改变。

所以考虑建图, \(a\to b\) 表示 \(a\) 必须在 \(b\) 前面,那么先手就是最小化这个图的最大拓扑序,而后手就是求出最大拓扑序。

考虑一个贪心,我们先把所有不互质的数连边,考虑一个连通块(显然各个连通块独立)的一颗生成树 我们可以通过给边定向的方式使得求得的拓扑序只能是这棵树的拓扑序。(也即任意非树边由深度小连向深度大)

所以我们从 \(1\) 开始,遍历与其有关的边,如果发现这个点还没有加入生成树那就加入然后递归儿子处理,并且定向。

(事实上,后手做的操作肯定是每次选的最大的儿子走,那么我们贪心的用最小的儿子递归处理,尽可能地使得大儿子被定向在后面(如果最后还是扫到了大儿子,只能说明这个连通块独立))

最后给这些树做最大拓扑序的拓扑排序即可(用优先队列做广搜)。

F

显然的 ICG 问题。

目的是求出每个位置的sg值

显然考虑每个点的sg值,找 必败态

考虑 极端情况 \(n=2\) 此时显然点权较大的那个点必胜,因为只能来回走,小的点先死掉。

而在一般情况,若先手走了一个点权比自己大的位置,则后手走回来之后相对关系不变,且点权变小。走回来的时候变成 \(0\) 先手就输了。

所以先手尽量的会走点权比自己小的位置。

而且还可以得出一个推论:若点 \(u\) 所有相邻点 \(v\) 的点权都不少于 \(u\)\(u\) 必败。

其实知道这个就够了。我们将原图的所有边 \((u,v)\) 根据点权大小关系定向(相同则删除此边,否则点权较大连向点权较小)

这就变成了一个走路问题了:每次可以走到后继结点,无法行动者判负。

直接 \(dp\) 即可。按照点权从小到大枚举点 \(u\) 并计算 \(dp\) 值即可(因为这张图的一个逆拓扑序就是点权)

AGC011

A

显然蠢蛋DP题,设 \(f_i\) 表示最后一辆公交的最后一个乘客是 \(i\) 时,最少辆数。

DP显然可以单调队列优化。

B

先按照大小排序,则显然若有 \(2s_{i-1}<a_i\),则说明 \([1,i-1]\) 全死。

那么找到最大的这个 \(i\),答案就是 \(n-i+1\)

C

显然你考虑 \((a,b),(c,d)\) 有边等价于 \((a,c)\) 有边,\((b,d)\) 有边。

那么把这个转移画出来,显然可以发现,\((a,b),(c,d)\) 连通的充要条件是存在一个 \(len\),使得原图存在一条 \((a,c),(b,d)\) 的路径长都是 \(len\)

由于无向边可以反复操作,所以可以变换为奇偶性相同

则黑白染色,得到三类点:

  1. 孤立点个数 \(a\)
  2. 二分图 \(b\)
  3. 有奇环图 \(c\)

显然,对于孤立点,两个维度有其一就必然是孤立的,所以有 \(2na-a^2=a(2n-a)\) 个。

显然对于二分图自己而言,二分图之间不连通,一个二分图的点对还分成两组点(奇数长度和偶数长度),则为 \(2b^2\)

显然对于奇环图自己而言,自己存在奇数路径也存在偶数路径,则为 \(c^2\) 个。

同时奇环图组合二分图,有 \(2bc\),对应点在对应连通块就必然连通。

综上所述答案是 \(a(2n-a)+2b^2+c^2+2bc\)

D

打表天下无敌

打表找规律得:若首项是 \(A\) 则改为 \(B\),若首项是 \(B\),则将原序列所有连续 \(B\) 段除了每段最后一个位置之外全部变成 \(A\)\(A\) 把原序列所有连续 \(A\) 段每段除了最后一个位置之外全部变成 \(B\),接着把最后一个位置变成 \(A\) 即可。

考虑这一个操作可以等价描述为将原序列循环左移一位,然后集体取反。

所以可以把环建立出来,容易实现 \(O(n+k)\) 修改。

但是我们注意到最终若 \(n\) 是偶数,变成 BABABABA 之后就不变了,而 \(n\) 是奇数则在 XBABABAB 两种情况来回变换。

容易发现显然不会操作太多次,于是我们暴力操作 \(10n\) 次之后进行判断即可。

E

这回真是简单题了。

一个递增的数显然可以表达为不超过 \(9\)\(\frac{1}{9}(10^i-1)\) 之和。

所以可以求出一个 \(k\) 使得 \(9N\) 可以表示为最少的 \(k\)\(10^i-1\) 之和。

则答案就是 \(\lceil\frac{k}{9}\rceil\)

考虑求和:\(9N=\sum^k_{i} 10^{a_i}-1\implies 9N+k=\sum 10^{a_i}\)

这时候我们考虑二分答案,判断答案是否成立很简单,统计 \(d(9N+k)\) 是数位和。

如果 \(d(9N+k)\le k\),且 \((9N+k)\equiv k(\bmod 9)\) (废话)就可行。

F

题意是真的迷惑。

用倒序视角

不妨看作 \(n\to 0\) 的火车是 \(0\to n\),但是在站 \(i\) 停留了 \(-q_i\) 时间,走一段路是时间是 \(-a_i\)

用对称将起点统一

\(p_i\) 为正着走的时候在站 \(i\) 停留的时间,\(q_i\)反着走的停留时间反着走,逆转起点与终点,令时间倒转

\(p_0,q_0\) 不计入答案,为自选值(其目的是方便处理,因为所有车发车时间整体后延不影响答案)。不妨令 \(\sum q+\sum a\bmod k=0\),这样由于每 \(k\) 分钟发新车,所以时间是在膜 \(k\) 意义下。

那么对于所有的 \(b_i=1\),第一辆车的跨过的时间是 \((Sa_{i-1}+Sp_{i-1},Sa_i+Sp_{i-1})+dk\),第二辆车跨过的时间是 \((-Sa_{i}-Sq_{i-1},-Sa_{i-1}-Sq_{i-1})+dk\)

两段时间没有交点,所以可以看出 \(2a_i>k\) 一定无解。

然后解不等式,相当于 \(Sa_i+Sp_{i-1}< -Sa_{i}-Sq_{i-1}\) 或者 \(Sa_{i-1}+Sp_{i-1}> -Sa_{i-1}-Sq_{i-1}\)

所以就是 \(Sp_{i-1}+Sq_{i-1}<-2Sa_i\) 或者 \(>-2Sa_{i-1}\)

取出它的补集 \([L_i,R_i]\),(注意这是模意义下的补集)问题转化为:

枚举最初的 \(p_0+q_0\),然后每次可以增加一个值 \(x\) 使得其落到 \([L_i,R_i]\) 中,求 \(n\) 次增加值的和的最小值

可以考虑设 \(f_{i,j}\) 为处理了 \([i,n]\)\([L,R]\),最终落到 \(j\) 的最小答案。

维护可以使用线段树,\(i:n\to 1\),每个版本的线段树存当前 \(f_i\) 下对于每个 \(j\) 的最优上个位置是哪个区间 \([L_t,R_t]\)。显然取出 \(L_i\) 更新一下 \(f_{i,L_i}\),然后将 \([L_i,R_i]\) 里面的“最优上一次位置”更新为 \(i\)

其实可以方便的设 \(dp_i\) 是处理完 \([i,n]\) 后,左端点是 \(L_i\) 的最小答案。则 \(dp_i=dp_j+dis(L_j,L_i),j>i,L_j\notin [L_i,R_i]\)\(j\) 是最小的满足条件的数。

至于最终答案显然是 \(2Sa_n+\min f_{1,x}\),而 \(\min f_{1,x}\) 可以集体通过线段树计算。

AGC012

A

显然从小到大排序后贪心地将 \((a_{3n},a_{3n-1},a_n),(a_{3n-2},a_{3n-3},a_2)…\) 配对最优

B

一个显然的想法是倒序处理,但是原问题也可以相应转化。

注意到颜色是不重要的,只需要知道第 \(i\) 个点最后一个被修改的时刻即可。

\(f_{i,j}\) 为第 \(i\) 个点,最后一次向距离不超过 \(j\) 的点进行修改的最后时刻。

则显然所求是所有的 \(f_{i,0}\)
转移是 $f_{v,j}=\max (f_{v,j+1},\max_{(u,v)} f_{u,j+1}) $

题目的条件相当于初始化 \(f\)

走路,距离等信息,只要具有类似划分同类子问题/操作的性质都可以利用递推/递归计算

C

一个很蠢的构造是:将序列变成若干个 \(s,s+1,……s+k,s,s+1……s+k\),拼在一起,每一段的值不重复,例如 \(12341234567567\)

这样每一段对答案的贡献是 \(2^{len/2}-1\)。需要消耗 \(len\) 个位置和 \(len/2\) 个元素。

显然构造是正确的,但是代价是 \(\sum [(N>>i)\&1]i\) 显然很容易超过 \(100\) 的限制。

考虑能不能利用这个 \(1234…k1234…k\) 的结构。

首先它自身贡献 \(2^{k}-1\) ,与此同时我们发现在 \([x,x+1]\) 之间插入一个未出现的数 \(t\),再在最后面插入 \(t\),可以让 \(t\)\([1,x]\) 的数构成的子序列计入答案,贡献是 \(2^x\)

如果需要多次插入不同的 \(t_1,t_2\),那么需要满足只看这几个插入的数其相对位置是 \(t_1t_2t_2t_1\),保证不会算重。

那么取出最大的合法的 \(k\),再将 \(N-2^k+1\) 进行二进制分解,每个为 \(1\) 的位都插入一个未出现过的 \(t\) 并将其也在末尾插一分即可。(注意自高往低满足偏序关系)

D

容易发现一个大小为 \(2\) 的连通块,可以互换位置,有 \(2!\) 种终态,一个大小为 \(3\) 的连通块,各个元素也可以互换位置,有 \(3!\) 种终态。

以此类推,假设大小为 \(k\) 的连通块有 \(k!\) 个终态,我们新加入一个 \(t\),就相当于 \(t\)\(k!\) 种情况操作完之后,随意选择 \(k+1\) 个位置进行交换。

所以一个大小为 \(siz\) 的连通块,其内部元素位置有 \(siz!\) 个终态。

由于颜色相同不区分,所以一个连通块的方案数是 \(\frac{siz!}{\sum c_i!}\) ,其中 \(c_i\) 是连通块内颜色 \(i\) 出现次数。

显然我们求出每个元素最终属于哪些连通块即可 \(O(n)\) 求出答案。

简单的,可以 \(O(n^2)\) 暴力连边,但是更容易注意到,对于同色元素,将 \(w\) 排序后,所有点能连都向第一个点连边即可。而异色元素,显然我们只考虑所有元素中最小的 \(w\) 和另一个与这个 \(w_{\min}\) 颜色不同的元素的最小的 \(w\)

与这两个位置判断后连边即可。

所以边数只有 \(O(n)\),总复杂度 \(O(n)\)

E

显然只能跳 \(O(\log V)\) 次,注意到 \(V\)\(N\) 同级。

而我们显然在一个位置的时候把附近的能走了的都走一定不劣。

所以一个直观的想法是对于 \(V\) 的每个状态(\(V,\frac{V}{2},\frac{V}{4}……\))都算出每个点能走到的区间。

那么问题就转化成了:从一个第零层的区间 \([l,r]\) 出发,每次操作可以选择下一层的任意一个区间,要求最后所有区间内元素合起来包含 \(1\sim n\),且同层区间不交,上层包含下层。

先不考虑最上面一层,可以使用一个状压求出 \(f[S],g[S]\) 为选择了 \(S\) 里那些层的点,最多可以覆盖 \([1,f[S]],[g[S],n]\)

DP 方法:求出每一层时,包含每个点的区间端点,枚举最后走哪一层,然后拓宽端点即可。例如 \(f[S\cup \lbrace dep\rbrace]=\max R_{pos_{dep,f[S]+1}}\)

这一步是 \(O(V\log V+N\log V)\) 的。

然后考虑第零层区间 \([l,r]\) 合法,当且仅当存在 \(S\),满足 \(f[S]+1\ge l,g[U/S]-1\le r\)

可以枚举 \(S\),查询第零层 \(f[S]+1\) 所在区间,判断是否合法,若合法则整个区间都标记合法即可。

F

我们考虑这个限制本质上是什么。

相当于是每次往决策集合里面扔两个数 \(x,y\),而答案 \(res\) 的变化情况是:

  • \(x,y<res\)\(res\) 变为决策集合里面的前驱
  • \(x,y>res\)\(res\) 变为决策集合里面的后缀
  • \(x<res<y\)\(res\) 不变

所以 \(res\) 只会变成当前决策集合下它的前驱后缀。

这意味着对于 \(b_{i},b_{i+1}\) 而言,在 \(i+1\) 时刻的决策集合下,这俩玩意不是相同就是互为前驱后继。

那就不会出现一个 \(j<i\)\(b_j\) 卡在 \(b_i,b_{i+1}\) 中间的情况。

而同时由于决策集合大小限制,将 \(a\) 排序后必然有 \(a_i\le b_i\le a_{2n-i}\)

由此我们得到了两个必要条件:

  • \(b_i\in [a_i,a_{2n-i}]\)
  • \(\forall j<i\)\((b_i-b_j)(b_{i+1}-b_j)\ge 0\)

当然还有 \(b_i\in \lbrace a_1,a_2…a_{2n-1}\rbrace\)

得到这两个必要条件不是什么难事。问题是需要确保其充分。

从必要条件出发构造出合法原序列,则说明必要条件合起来是充分的

\(a_1=b_1\) 是显然

现在我们假设已经构造了 \(a_1\sim a_{2n-3}\),现在考虑如何加入数字满足 \(b_i\)

如果 \(b_i\) 已经在 \(a_1\sim a_{2n-3}\) 里面出现过,考虑贪心地移动位置(三种情况分别加入未出现最值)。

如果不在,先扔进去,然后再加进去一个未出现最值调整位置。

打表发现这个构造是正确的。事实上手玩可以感性理解,我们每次加入的最值,在后面的决策都是无用的值(这个很容易感知),而由于其在 \(i-1\) 之后就无用了,也不会夹在 \(b_{i-1},b_i\) 之间。

那么我们就是要对符合条件的 \(b\) 序列进行计数,这个比较简单。

倒着操作,则每次相当于删掉可选集合里 \(b_i,b_{i+1}\) 之间的部分。

那么容易的,设 \(f_{i,l,r}\) 为处理 \(b_i\) 后,决策集合里的数在 \(b_i\) 左边和 \(b_i\) 右边的还能剩下多少。

我们每次将 \(a_i,a_{2n-i}\) 加入决策集合,这一定是最左边和最右边的。(如果 \(a_i=a_{i-1}\) 或者 \(a_{2n-i}=a_{2n-i+1}\) 则说明决策集合这边不增加,这是为了不算重,我们只考虑其第一次出现)。

枚举上一个 \(b_{i+1}\) 是多少,删掉两者之间的可选集合数目即可。

也就是设 \(x=[a_{i}\neq a_{i-1}],y=[a_{2n-i}\neq a_{2n-i+1}]\),则 \(f_{i+1,l,r}\to f_{i,l+x,r+y},f_{i,l+x+1,k}[k<r+y],f_{i,k,r+y+1}[k<l+x]\)

\(O(N^4)\)

AGC013

A

直接 \(dp\) 即可,记录上一个是上升还是下降,当前是新开还是不新开。

B

注意只有端点有限制,那么一个很简单的贪心是选择一条边,然后从端点开始不断拓展,每次选一个直接相连且不在路径上的位置走过去。

显然会在有限步内结束,正确性显然。

C

几个重要的信息(经典模型

  • 蚂蚁最终相对顺序不变,序列上可以直接让最小的位置是最开始最前面的,环上只能说明循环同构。
  • 两只蚂蚁相撞后反向,可以看作每只蚂蚁最开始有个权值 \(d\),第 \(i\) 只初始是 \(i\),相撞后将两者的 \(d\) 进行交换
  • 确定第一只蚂蚁最终位置即可确定全局,而容易发现一只蚂蚁逆时针跨过 \(0\) 会让第一只蚂蚁的绝对位置前移一,顺时针跨过就是绝对位置后移一,绝对位置在 \(\bmod n\) 意义下。所以只需要计算每只蚂蚁跨过了几次 \(0\) 即可确定第一只蚂蚁最后的绝对排名。

D

这伞兵玩意能黑,离谱

感觉是简单题。

一个直觉是设 \(f_{i,j}\) 为当前有 \(i\) 个白球,\(j\) 次操作产生的不同操作序列个数。

  • \(f_{i,0}=[0\le i\le n]\)
  • \(f_{i,j}=[i<n](f_{i,j-1}+f_{i+1,j-1})+[i>0](f_{i-1,j-1}+f_{i,j-1})\)

答案是 \(\sum f_{i,j}\)

容易发现会算重,其原因是不同的初始局面可能给出相同的取出序列

如何去重?容斥是去重的主要手段,而其中包含了 反演,差分 等等技巧。

其实很简单,我们只需要钦定一个取出序列对应达到过 \(0\) 个白球的初始局面即可。

这是区别于其他初始界面的 特征

这个怎么算?很简单,可以容斥,我们可以钦定一个白球在盒子里始终没有动过,这样就能够算出每种取出序列对应的必然没有达到 $0 $ 个白球的初始局面的总和,用总的减掉即可。容易发现这就是 \((n-1,m)\) 的子问题。

所以答案是 \(ans(n,m)-ans(n-1,m)\)

E

显然设 \(f_i\) 为长为 \(i\) 的木板的答案,则有:

\(f_i=\sum f_{i-k}k^2[ban(i-k)\neq 1]\)

考虑优化,可以改写为 \(f_{i}=\sum (i-k)^2f_k[ban(k)\neq 1]\)

拆开,不妨设 \(S_{i,0}=\sum f_k,S_{i,1}=\sum kf_k,S_{i,2}=\sum k^2f_k\),其中排除掉 \(ban(k)=1\) 的位置。

这样设貌似会涉及到 \(i^2,i,1\) 的维护,有些麻烦,倒不如直接维护:

\(S_{i,0}=\sum f_k,S_{i,1}=\sum (i-k)f_k,S_{i,2}=\sum (i-k)^2f_k\),其中 \(ban_k=0\)

\(f_n=S_{i,2}\implies S_{n,0}=(S_{n-1,2}+2S_{n-1,1}+S_{n-1,0})[ban_n=0]+S_{n-1,0},S_{n,1}=S_{n-1,0}+S_{n-1,1},S_{n,2}=S_{n-1,2}+2S_{n-1,1}+S_{n-1,0}\)

可以写出矩阵,当 \(t=[ban_n=0]\) 时:

\[\begin{bmatrix} S_{n-1,0}&S_{n-1,1}&S_{n-1,2} \end{bmatrix} \times \begin{bmatrix} 1+t&1&1\\ 2t&1&2\\ t&0&1\\ \end{bmatrix} = \begin{bmatrix} S_{n,0}&S_{n,1}&S_{n,2}\\ \end{bmatrix} \]

所求即为 \(S_{n-1,2}+2S_{n-1,1}+S_{n-1,0}\)

初始化:\(S_{0,0}=1\)

组合意义天地灭,代数推导保平安

F

考虑单次操作如何求答案。

\(Y\) 排序,从小到大处理。

显然当我们确定了选择值时必然是按照排名依次匹配。

这个贪心显然正确,但是还有另一个形式。

根据霍尔定理,可以等价转化为对于 \(Y\) 中排名为 \(i\) 的数,至少需要选出 \(i\) 个数小于等于它

相当于说,设一个权值数组 \(d\),初始 \(d_i=-i\),每次选出数 \(x\) 后找到第一个大于等于它的数 \(Y_{j}\),将 \([j,n]\) 全部加上 \(1\),最后最小值大于等于零即可以成功匹配。

多元选择性问题,可以钦定选择某一个,在此基础上做出调整。)

考虑调整法

假定我们先全部只选第一个元素,这时候遇到不满足要求的,我们可以对每个二元组计算出换选第二个元素的影响区间 \([l_i,r_i]\)

问题就变成了给出 \(n-1\) 个区间和一个整数序列 \(d\),每个区间可以使用一次将 \([l_i,r_i]\) 全部加一,用最少的区间使得最小值不大于零。

这时候我们同样考虑询问,显然我们可以枚举使用哪一个,并计算其影响位置,那么问题就变成了计算 \(f_i\) 为使用最少的区间个数,使得 \(\forall k,d_k\ge -[k>i]\)

也就是 \([1,i]\) 下界限制是 \(0\)\([i+1,n]\)\(-1\)

考虑先求出 \(f_0\)。显然 \(f_i\) 是在 \(f_{i-1}\) 的基础上增选区间最优(如果不是这样,\(f_{i-1}\) 按照这样调整也是合法的)。

而增选区间时显然有贪心策略,若 \(d_i=-1\),则增选包含 \(i\) 的右端点最大的区间,这显然最优。

问题在于求出 \(f_0\)。注意我们最终是从前往后求出 \(f_i\),所以这里需要从后往前求出 \(f_0\)

(如果这里从前往后求 \(f_0\),虽然 \(f_n\) 不会变化,但是过程中的 \(f\) 会变小,从后往前可以尽可能地将增大的机会留到前面,使得各个 \(f_i\) 取到最优值)。事实上不会证明,背结论吧

从后往前求 \(f_0\) 显然增选包含的左端点最小的。

用优先队列和树状数组维护一下这个操作就OK了。注意无解的判断。

AGC014

A

直觉告诉我们在不会太多轮,如果不会终止则三个数一样。

考虑暴力模拟 100 轮后还未终止就认为无解。

B

考虑树上差分,钦定 \(1\) 为根,由于只关心边权奇偶性,所以 \((u,v)\) 可以拆为 \((1,u),(1,v)\),而 \(1\) 不用考虑,那就是将 \(u,v\) 打上标记即可。

然后考虑子树求和这一步,如果说原本存在至少一个奇数,那么深度最大的那个一定不能被合并,所以必须要全部都是偶数。

全部都是偶数显然成立。

(事实上对于任意一棵树答案相同)

C

显然找到所有 \(k\) 步之内能够走到的节点,然后一直往一个方向走即可。

D

先考虑链的情况,容易发现后手赢当且仅当长度是偶数。其策略是先手每次染与端点距离为 \(2\) 的点,逼迫后手只能染中间那个格子。

稍加推广,容易发现如果先手将一个叶子的父亲染白,则后手必须染这个叶子。操作完后这一对父子等价于不存在

可以看出若两个及其以上叶子有共同父亲,那么先手必胜。

所以一个想法是暴力找度数为一的店,删去它和它的相邻点。最终若存在孤立点则先手必胜。

这个过程类似于匹配,而想到匹配(树上相邻点——二分图——匹配)后可以发现若存在完美匹配,则后手必胜。

是否充分?其实是充分的,因为后手只能在先手染了之后染其匹配点,若不存在完美匹配,则染了之后仍然不是完美匹配,最终会保留一些不能匹配的孤立点,那时候先手必胜。(事实上和那个暴力想法是一样的)

E

一个很 naive 的正向结论:每次只能刪覆盖次数为 \(1\) 的蓝边,而删了之后对其他询问并没有影响

用树链剖分维护这个刪边过程,若能够删完就有解,否则无解。

还可以正难则反,考虑最后一步一定是一个重边,那么拿出这样的最后一步,考虑往前推

倒数第二步操作点要么是直接相连的,要么就是距离是 \(2\),且有一个点是最后一步操作的点,另一个点与另一个点相邻,\((u,v)\)

其实可以刻画为将最后一步 \((u,v)\) 的邻边合并。红蓝都合。

这样合并后又是一个同样的子问题,利用启发式合并维护即可。

F

nb题目。

最开始有个想法:若 \(1\) 在开头,暴力操作一次,然后若 \(1\) 变为第一位就说明整体已经排好了序。

但是很遗憾这是错的,如 3241

但是有个启发是若 \([2,n]\) 相对顺序已经正确,则只需要判断 \(1\) 是否在开头即可,进一步可以发现 \(1\) 是否存在对 \([2,n]\) 之间的数经过操作之后的相对位置并无影响,因为它不会影响其他的前缀最大值选取

扩展这个结论可以得到:

  • 若仅考虑 \([i,n]\) 的数,则 \(i\) 是否存在不会影响操作后的 \([i+1,n]\) 的数的相对顺序,因为最小值是否选取不影响其他值选取。

则可以考虑设 \(f_i\) 为考虑数 \([i,n]\) 相对顺序排好的最小操作次数。

\(f_i=0\) 时,再看 \(f_{i-1}\) 只需要判断相对顺序是否 \(ok\) 即可。不行就增加一次操作。

\(f_i\ge 1\) 时就有些影响。

考虑经过 \(f_i\) 次操作后 \([i,n]\) 相对顺序修正,我们需要判断此时 \(i-1\) 是否在开头。

这个时候一个很神妙的东西就出来了,考虑经过 \(f_i-1\) 步后有:

  • \(i\) 不在开头。
  • \(k\) 为开头位置,则 \(i-1,i,k\) 的相对位置循环不变。

通过手玩 \(3\) 的排列的所有情况可以看出,相对位置循环不变当且仅当不出现 21323 都被选中。

而有一个性质是\(k\) 除非出现在开头,否则不可能被选中——(证明:假定它不在开头且被选中了,则它不可能再次跑到开头来,因为操作后它前面的数与他的关系只有都选,都不选,只选它自己三个情况,而前面两个情况不会影响,而第三个情况操作后又回到了这个情景(它不是开头元素,前面必然有元素仍然被选中)。

按照这个情况来说,假定 \(i-1\)\(1\)\(i\)\(2\)\(k>2\) 不失一般性,不会出现 \(2,1,k\)\(k\) 被选中的情况,则循环顺序不变。

则由于 \(f_i\) 次操作后 \(2\)\(k\) 前面,则只有 \(12k,21k\) 三个情况。

则最初局面如果与 \(21k\) 循环同构则必须要增加次数,否则就会让 \(i-1\) 到开头。

所以不妨设 \(p_i\) 为元素 \(i\) 的出现位置,则有:

\(p_{i-1},p_{i},p_k\) 与相对顺序与 \(123\) 循环同构时, \(f_{i-1}=f_{i}\)\(k\) 不变

否则 \(f_{i-1}=f_{i}+1,k\leftarrow i\)

AGC015

抽象场

A

显然考虑 \([A+(n-1)B,B+(n-1)A]\) 都能取到,注意判无解。

B

若当前是 D\([1,i-1]\) 花费代价 \(1\)\([i+1,n]\) 花费代价 \(2\)。否则反过来。

C

保证是树,那么连通块个数就是点数减去边数。

可以用三个二维前缀和,一个存点,一个存 \((i,j)\to (i+1,j)\) 的边,一个存 \((i,j)\to (i,j+1)\) 的边,计算即可。

D

显然我们最多选用两个数就可以得出所有结果

先把 \(A,B\) 的二进制 \(LCP\) 变为全零,这没有意义。

那么必然有 \(A<2^k\le B\),则显然最大值可以取到 \(2^{k+1}-1\)\(l\)\([A,2^k-1]\) 逐步取,而 \(r\)\(2^k\),就可以做到 \([A|2^k,2^{k+1}-1]\)

再考虑 \(B\) 的作用。考虑 \(l\)\(2^k\) 开始取,此时设 \(B\) 的次高位(若没有则不计算这部分贡献)为 \(t\),则可以取到 \([B,B|(2^{t+1}-1)]\)

容易发现就这三区间,其他的讨论后也取不到,三区间拿出来取个并集就行了。

E

手摸找结论

不妨按照 \(x\) 排序。题目保证了 \(v,x\) 互不相同。

则若 \(i\) 点亮,\(j\)\(i\) 影响到进而被点亮,显然有:

  • \(j<i:v_j>v_i\)
  • \(j>i:v_j<\max v[1,i]\)

而其实 \(j<i\) 应当写为 \(v_j>\min v[i,n]\),因为间接点亮。

那么写出来就是:

\[\begin{cases} j<i:v_j>\min &v[i,n]\\ j>i:v_j<\max &v[1,i] \end{cases} \]

容易发现每个点是否受到影响其实只需要看其相邻两个初始点

所以就可以开始 \(dp\) 了。

\(f_i\) 为解决了 \([1,i]\) 的点的点亮问题,且 \(i\) 被点亮的方案数,有:

\(f_i=\sum f_{j}[\forall k\in [j+1,i-1],v_k<\min v[i,n]\or v_k>\max v[1,j]]\)

而又因为 \(\min v[i,n]\) 单调递增,\(\max v[1,i]\) 单调递增,上面的限制可以写作不存在 \(k\in [j+1,i-1],\max v[1,j]<v_k<\min v[i,n]\),随着 \(j\) 的减少限制越发宽松,所以 \(j\in [j_{\min},i-1]\) 都是可以取的。

我们只需要维护 \(j_{\min}\) 即可,而又因为 \(\min v[i,n]\) 不降,所以 \(j_{\min }\) 不降。

用一个指针维护 $j_{\min} $ 即可,具体判断可以离散化 \(v\) 后用树状数组查区间内有没有 \(k\) 不满足要求,用前缀和优化转移。(不过也可以看作 \((i,v_i)\) 平面扫点?)

复杂度 \(O(n\log n)\)

F

找规律题

一个广为人知的结论是 \(Fib\) 数列是使得 \(\gcd\) 执行次数最多的数列。 \(\gcd(Fib_{x},Fib_{y})\) 的执行次数是 \(\min (x,y)-1\),但是要特判 \(Fib_{0\sim 2}\)

下面默认 \(X\le Y\)

答案为 \(1\) 时直接输出 \(Y\bmod p\) 即可。

我们找到最大的 \(k\) 使得 \(Fib_k\le x,Fib_{k+1}\le y\),则 \(k-1\) 就是最大执行次数。

直觉告诉我们如果钦定数对 \((i,j)\) 当且仅当 \(F(i,j)=k-1\)\(j<2i,\gcd(i,j)=1\) 时才能产生贡献,则容易发现这样的数对只有 \(O(\log n)\) 个。(因为显然有 \(F(i,j)=F(ki,kj)\)

然后打打表容易发现如果反复对这样的数对 \((i,j)\) 进行辗转相除,则要么变成一对斐波那契数,要么在第一次 \(2i'\le j'\) 时,有 \(i',j'\) 是距离为 \(2\) 的斐波那契数。例如 \(x=20,y=20\) 时,最多执行 \(5\) 次,符合要求是数对分别是:

  • \((8,13)\)
  • \((11,18)\to (1,3)\)
  • \((11,19)\to (3,8)\)
  • \((12,19)\to (2,5)\)
  • \((13,19)\to (5,13)\)

其实这样是可以理解的,在若干步后 \((i',j')\) 一定可以表示为 \((Fib_a,Fib_b)\) 而若 \(b>a+2\)\(Fib_b\ge 4Fib_a\),回到上一步 \((Fib_b,Fib_a+Fib_b)\),可以被 \((Fib_{b-1},Fib_b)\) 回撤直接得到一个更优的解(这是因为 \(2Fib_i\ge Fib_{i+1}\)),所以不可能成为最优解。

所以我们处理出所有的 \((Fib_i,Fib_{i+1}),(Fib_i,Fib_{i+2})\),然后往上继续变换直到超过上界,把得到的数对加入相应答案的 vector 里面

预处理是 \(O(\log ^2V)\) 的,实现稍差一些是 \(O(\log^3 V)\)

询问的时候先找到答案,然后计算数对 \((i,j)\) 的贡献,这时候显然有 \(x<i+j\implies 3i>x\),所以可以枚举 \((ki,kj)\),然后固定一维算另一维,因为 \(F(ki,kj)=F(ki,kj+tki)=F(ki+skj,kj)\)

注意第一维大于第二维的情况也要算。

AGC016

A

考虑最终保留字符 \(x\) ,其出现位置是 \(p_1\sim p_m\),(定义 \(p_0=0,p_{m+1}=n+1\))则所需最小次数显然是 \(\max_{1\le i\le m+1}(p_i-p_{i-1}-1)\)

计算即可。

B

纯分类讨论题,样例让此题毫无难度。

先排序。必须有 \(a_n-a_1\le 1\)

  • \(a_1=a_n\) 此时只有两个情况:所有人颜色不一样,否则没有人有单独的一种颜色,其判断就是 \(a_n=n-1\)\(a_n\le \lfloor\frac{n}{2}\rfloor\)

  • \(a_1\neq a_n\) 此时设有单独颜色的人的人数是 \(c\),则必然有 \(a_1\ge c\),且剩下 \(n-c\) 个人有 \(a_n-c\) 种颜色,最佳情况也是两个人一种颜色,那么若 \((a_n-c)2>n-c\) 也死了。

C

容易发现若 \(h|H,w|W\) 必然无解,因为我们可以把整个矩形划分为 \(\frac{HW}{hw}\) 个不交的 \(h\times w\) 子矩形,每一个和都是负数。

我们声称其余情况必然有解。

容易发现,**对于任意 \(h\times w\) 的子矩阵内,有且仅有一个点坐标 \((x,y)\) 满足 \(h|x,w|y\) **

可以考虑将这个点设为 \(-k(hw-1)-1\),其余点设为 \(k\),则每个 \(h\times w\) 子矩形和是 \(-1\),且我们可以在抵消掉所有负数的同时保留一些 \(k\)\(k\) 设为不超过上界的最大值就行了。

至少可以多出 \(k\min(H,W)\) 而其余点抵消后是 \(-\lfloor\frac{H}{h}\rfloor\lfloor\frac{W}{w}\rfloor\) 满足这个偏序即可。

D

显然可以看出若增加一个位置 \(n+1\)\(A,B\) 序列整体的异或和,那么每次相当于是选择一个位置 \(i\),交换 \(A_i,A_{n+1}\),求变为 \(B\) 的最小次数。

显然动 \(A_i=B_i(i\le n)\) 不优,直接删去。然后再看一下各个数出现次数盘一下无解

然后从排列的特殊情况拓展,剩下的连边 \((A_i,B_i)\),则可以看作一个球从 \(n+1\) 需要经过每条边一次,同时从一个连通块移动到另一个需要 \(1\) 的代价,那么答案就是边数加上连通块个数减一。(需要考虑 \(n+1\)

都可以减一吗?不对的,若 \(A_{n+1}=B_{n+1}\) 且不存在 \(A_i\neq B_i,A_i=A_{n+1}\)。则需要先拆掉这个边,最后又需要搞回来,还需要加一,如果存在可以最后移动这个 \(A_i\) 直接归位省下一次操作。

E

我们直接正推,容易发现给每个时间段的点建图之后是一个 2-SAT 问题。

这启发我们逻辑上处理这个问题。

不妨设 \(v[i,j]\)\(i,j\) 是否可能同时存活,设 \(ud[i]\)\(i\) 当前是否必死。

则对于输入 \((x,y)\),若 \(v[x,y]=0\),则 \(ud[x]=ud[y]=1\),直接两个都必死。
否则将 \(v[x,y]=v[y,x]=0\)

然后考虑它的影响,若 \(ud[x]=1\)\(y\) 同理),将所有 \(v[i,x],v[x,i]\) 置为零,若 \(v[i,x]=0\) 则可以推出 \(v[i,y]=0\),这是因为 \(v[i,x]\) 先发生,此时若已经死了 \(x\)\(y\) 必死,否则 \(i\) 就死了,\(v[i,y]\) 就是零了。\(y\) 同理。

对于 \(v[i,x],v[i,y]\) 都更新一下即可。

\(O(nm)\)

F

经典状压 DP 结合SG函数

显然在 \(1\) 有一个石子和 \(2\) 有一个石子的两个独立的ICG,根据SG函数的结论,他们的和是 \(sg[1]\oplus sg[2]\) 显然容斥,计算先手必败局面,此时有 \(sg[1]=sg[2]\)

考虑 \(sg[i]=mex_{(i\to j)}sg[j]\)

在这个局面里面其实我们只关心 \(sg\) 值是否为零。通过 \(N\le 15\) 我们猜出大概是 \(O(N3^N)\) 的子集DP,一个很神秘的想法是类比状压拓扑排序一样,我们枚举哪一个子集 \(sg\) 值全是零。

详细的说:\(f[S]\) 为当前只考虑点集 \(S\) 的导出子图,\(sg[1]=sg[2]\) 的方案数,要求 \(1\in S,2\in S\)。(注意初始化一个边全删的 \(1\)

每次枚举 \(sg\) 值全是零的子集进行转移。不妨设这个子集是 \(T\)。需要满足 \(1,2\) 同时属于或者不属于 \(T\)

则一个重要的性质是:

\(sg[1]=sg[2]>0\),则说明 \(T\) 中点互相无边,\(T\to S-T\) 任意边,\(\forall x\in S-T\),\(x\)\(T\) 至少有一条边,\(S-T\) 内部的边方案数是 \(f[S-T]\)

\(sg[1]=sg[2]=0\),此时 \(S-T\) 内部的边是任意连的

不妨设 \(c[S,i]\)\(\sum_{i\to j}[j\in S]\),则可以表达为:

\[\begin{cases} 1,2\notin T&:f[S]\leftarrow f[S]+f[S-T]\times \prod_{x\in T}2^{c[S-T,x]}\prod_{x\in S-T}(2^{c[T,x]}-1)\\ 1,2\in T&:f[S]\leftarrow f[S]+\prod_{x\in T}2^{c[S-T,x]}\prod_{x\in S-T}(2^{c[T,x]}-1)2^{c[S-T,x]}\\ \end{cases} \]

可能对于第二个转移有些疑惑,因为有点循环论证的味道。

但事实上我们可以发现出度为零的点不可能出现在 \(S-T\) 里面,从 \(1\) 开始增大,可以满足每个 \(S-T\) 里的点可以碰到一个编号更小的 \(0\),而每个零不可能碰到零,得证。(因为每条边满足 \(v\to u,v<u\)

AGC017

A

显然只和每个 \(a_i\) 的奇偶性相关,因此当没有奇数时,答案为 \([c=0]2^n\),否则是 \(2^{n-1}\)

B

首先判掉 \(A+D(n-1)< B\) 的情况。

我们考虑可以直接令 \(A'=0,B'=B-A\),下面默认 \(A=0\)

考虑一个 \(C,D\) 可以在 \(n-1\) 次操作里弄出哪些数字。

假设都是正的,那么有 \([C(n-1),D(n-1)]\)

有一个负的,那么有 \([C(n-2)-D,D(n-2)-C]\)

\(k\) 个负的,那么有 \([C(n-k-1)-Dk,D(n-k-1)-kC]\)

所以其覆盖区间为 \(k\in [0,n-1],[C(n-1)-(C+D)k,D(n-1)-(C+D)k]\),由于所有区间不相交且长度相同,蛮力求出距离 \(B\) 最近的左端点,判断是否覆盖即可。

C

\(c_i\) 为值为 \(i\) 的球的出现个数,那么当 \(k=i\) 时候,\(k'=k-c_i\)

相当于跳过了 \([i-c_i+1,i]\) 这一段。我们不妨将 \([i-c_i+1,i]\) 标记为可跳过,则有解当且仅当从 \(n\) 开始可以一直跳过到 \(0\)

也就是 \([1,n]\) 被全局覆盖。

而最少修改球数其实改一个球相当于填上一个空位,所以我们维护 \([1,n]\) 的空位个数。由于 \(\sum c=n\),所以有 \(i\) 个空位则必然能够从覆盖次数大于 \(1\) 的位置里拿出 \(i\) 个位置补上。

所以答案就是空位个数。

修改可以看作对 \(c\) 的单点加一或减一,可以 \(O(1)\) 维护。

D

Hackenbush 的基本模型。

显然这是一个公平组合游戏,考虑 \(sg\) 函数。叶子的函数值显然是零。

首先对于一个树而言,这整棵树的游戏相当于其与各个儿子的子树的游戏和。(也就是各个儿子的子树分别接一个根上去进行游戏)。

其原理不难理解,看作有向图游戏的话,各个子树的决策是独立的

则我们考虑各个子树增加了一个根结点之后的 sg 函数值,根节点的 sg 值就是这些值的 \(xor\)

考虑增加一个根节点之后的局面,求出其 \(sg\) 值相当于求后继局面的 \(mex\)

显然这个后继局面可以取到 \(0\),且如果不断儿子与根之间的边的话,若删除子树内的边,还是相当于一个子问题

及时发现可以归纳证明

首先当 \(siz=2\) 的时候,只有这一条边,\(sg\) 取到 \(1\),因为后继只有零,这时候满足比未加入根时多一,我们假定加入根后 \(sg\) 值增加一。

则对于一般情况,首先可以断掉根与原本儿子的边,取到 \(0\),其次断掉树里面的边,相当于一个更小的子问题,假定归纳成立,原本的 \(sg\) 值为 \(k\),则这一步可以拿出 \(\lbrace 1,2,3……k\rbrace\),又因为 \(0\) 可以取到,则新的 \(sg\) 值为 \(k+1\)

成立。

所以:\(sg_u=\bigoplus_{u\to v}(sg_v+1)\)

E

一个比较显然的思路是把能够放在一起的东西连有向边,然后判断是否存在一条从某个点出发经过所有点一次的路径。

但是这样边数是 \(O(N^2)\) 的指定不行。

所以考虑变换,考虑能够连边的条件:

R L
\(d=0\) \(b=c,c>0\)
\(d>0\) \(d=a,a=0\)

则可以有:

\(d=0:\)\(r=b+h\)
\(d>0:\)\(r=d\)
\(c=0:\)\(l=a\)
\(c>0:\)\(l=c+h\)

则除了 \(d=c=0\) 的情况之外,若 \(r_i=l_j\),则有边 \(i\to j\)

考虑 点化边,一个 \((l_i,r_i)\) 可以当作一条边,这样两个积木拼在一起就相当于 \(l_0\to r_0=l_1\to r_1\),只要用上所有边恰好一次就行了。

而因为有 \(d_0=c_1=0\) 的情况,就相当于一个大于 \(h\) 的点可以和一个小于等于 \(h\) 的点拼接在一起。

所以原问题变成了若干条路径覆盖所有边,起点都是 \(\le h\) 的,终点都是 \(> h\)

显然有必要条件:各个弱连通块(非单点)必须有至少一个点满足 \(in_i\neq out_i\),且对于 \(i>h\),必须有 \(out_i\le in_i\)\(i\le h,in_i\le out_i\)

(寻找办法是想象一个虚点,所有 \(>h\) 的点 \(x\) 连向它,它连向所有 \(\le h\) 的点,则相当于是找一条欧拉回路,从虚点出发,回到虚点,经过所有非虚点作为端点的边)

有向图存在欧拉回路的充分必要条件是 \(in_i=out_i\) 所以得到以上条件。(一个弱连通图必须有一个不等的点用于联系外界)

然后容易发现把不等的点用虚点把度数补为相同(由于出度和等于入度和,所以虚点出入度相同),就变成了欧拉回路。

F

等价转化一下每个点的决策,假设要往右走看成 \(1\)

也就是说一个路径等价于一个 \(01\) 串,且当前坐标是 \((i,s[i])\)

则也就是要求有多少 \(m\times n\)\(01\) 矩阵,满足:

对于所有的 \((i,j),1\le i<n\),有 \(s[i][1\sim j]<=s[i+1][1\sim j]\)

并且给定了 \(k\) 个点的值。

最开始的想法是我们可以状压行,也就是将一行当作一个状态,找后继状态进行转移,我们发现这样难以优化,后继状态的分布很难处理。(注意一下叙述中矩阵的首位对应二进制最高位,所以位置是从上往下算的)

但是我们可以考虑一个数位 \(dp\) 的想法合并后继状态,这样的状态设计非常经典,\(f_{i,j,S}\) 为第 \(i\) 行填了前 \(j\) 个数,前面 \(i\) 个数和后面 \(n-j\) 个数上一行拼起来是 \(S\)

一种描述也可以是 \(f[i,j,s]\)\(s[j+1,n-1]\) 为当前做出的决策,\(s[0,j]\) 为不能少于的决策

状压过程中维护限制决策的信息,我们考虑填入 \(S[j]\) 的过程:

  • \(S[j]=1\) 说明这里只能放 \(1\) \(f_{i,j,S}\to f_{i,j-1,S}\)
  • \(S[j]=0\) 说明这里放 \(0\) 可以,如果放入一个 \(1\) 就可以直接将 \(S\) 在后面限制里的一个 \(1\) 对冲掉,直接删除,设删除后为 \(T\),有:
    • \(f_{i,j,S}\to f_{i,j-1,S}\)
    • \(f_{i,j,S}\to f_{i,j-1,T|2^j}\)

注意转移细节比较多。

启发:当DP转移的前驱/后继状态繁杂,不妨增加维度,根据前驱后继状态的一些特征进行划分求解。

code

AGC018

A

根据裴蜀定理,只要有 \(K\equiv 0(\bmod \gcd(a_1\sim a_n))\)\(K\le \max a_i\) 即可。

B

容易发现如果禁止一个项目,参与剩余项目的人的个数不会变少。

所以贪心地直接最初钦定所有项目都可选,每次删去人数最多的一个,每次对答案取 $\min $ 即可。

C

显然先拆分贡献,假定所有点都取 \(c\) ,变换 \((a_i,b_i,c_i)\to (a_i-c_i,b_i-c_i)\),不妨设为 \((f_i,g_i)\) 那么答案也就是选出 \(x\)\(f_i\)\(y\)\(g_i\) 使得其和最大。

考虑两个 \((f_i,g_i),(f_j,g_j)\) 分别取 \(f,g\) 优于取 \(g,f\),则有:

\(f_i+g_j>f_j+g_i\implies f_i-g_i>f_j-g_j\) 所以按照 \(f-g\) 排序后必然存在分割点 \(k\)\([1,k]\) 里选出 \(x\)\(f\)\([k+1,n]\) 里选出 \(y\)\(g\),利用堆/权值树做个前后缀贡献即可。

D

根据ABC362F的经验,我们可以考虑树的重心,假定我们先求出最长哈密顿回路,一条边被经过次数的上界显然是 \(\min(siz,n-siz)·2w\)

同时我们声明可以达到这个上界,具体考虑采取找到重心,然后选定一个叶子 \(x\),同时选定一个不在重心同一子树的叶子 \(y\),加入 \(x\to y\),然后删除 \(x\),并且令 \(y\) 成为新的 \(x\),直到树操作为空或者树仅剩重心。最后将重心连回最初的 \(x\)

容易证明这样每条边都达到了上界。

则考虑求最长路,从回路中断掉一条最短的边,容易发现在上述构造中可能成为最短边的集合就是重心到其各个儿子的边权。

则我们找到这样的边中最短的一条选择断掉即可。注意双重心就断掉连接重心的边。

最长回路中删去最短边达到最长通路,是一个思考方向,但是我们需要证明它是最优的

我们假定存在一条最长哈密顿路径 \(P\) 不是我们所求的那一条,但是可以发现我们求得的最长哈密顿回路是没有问题的,且它对每条树边贡献取到了上界。

则这一条假定的路径 \(P\) 必然至少在最长哈密顿路径里面少掉一个 \(dis\),这个 \(dis\) 指重心到其的距离。

则必然存在一条重心的邻边比这个 \(dis\) 小,就证明了最优性。

E

原题等价于:

\[\sum_{X_1\le sx\le X_2}\sum_{Y_1\le sy\le Y_2}\sum_{X_3\le mx\le X_4}\sum_{Y_3\le my\le Y_4}\sum _{X_5\le tx\le X_6}\sum_{Y_5\le ty\le Y_6}{mx+my-sx-sy\choose mx-sx}{tx+ty-mx-my\choose tx-mx} \]

首先考虑矩阵 \((X_1,Y_1)\to (X_2,Y_2)\) 到点 \((x_0,y_0)\) 的距离,有 \(x_0>X_2,y_0>Y_2\)

也即:

\[\sum_{X_1\le x\le X_2}\sum_{Y_1\le x\le Y_2}{x_0+y_0+x+y\choose x_0-x} \]

根据差分的知识,我们只需要求出:

\[\sum_{x=0}^{X_2}\sum_{y=0}^{Y_2}{x_0+y_0-x-y\choose x_0-x} \]

这个式子容易求出是 \({x_0+y_0-X_2-Y_2+2\choose x_0-X_2+1}\)

带入二维差分 \((X_1,Y_1)+(X_2+1,Y_2+1)-(X_1,Y_2+1)-(X_2,Y_1+1)\) 可以写出:

\[{x_0+y_0-X_1-Y_1+2\choose y_0-Y_1+1}-{x_0+y_0-X_2-Y_1+1\choose y_0-Y_1+1}-{x_0+y_0-X_1-Y_2+1\choose y_0-Y_2}+{x_0+y_0-X_2-Y_2\choose y_0-Y_2} \]

然后我们再考虑一个矩形到另一个矩形的方案数,根据差分也可以看作上述四个点到另一个矩形的方案数,也就是可以看成 \(16\) 个点的容斥,其计算并不困难,\(16\) 次枚举顶点,处理好容斥系数即可。

然后考虑原问题。

好了让我们回到原问题,途径一个矩形是什么玩意。

一个 \(V^2\) 的想法是枚举途径矩形的点来算。

但是这样是否仍然可以优化?这涉及了乘法哎

我们考虑枚举中间矩形的边界点,计算它的贡献次数。

其实就是枚举中间矩形的一个边界点 \((x,y)\) 然后它的所有路径需要乘上一个在矩形内部经过的点的个数作为加权。

例如从 \((x_0,y_0)\) 进入从 \((x_1,y_1)\) 离开,则经过了 \(\Delta x+\Delta y+1\) 个节点(矩形内部),并且我们成功去掉了边界,事实上下/右边界可以加一处理。

不妨先拿到一个 \(f(x,y)\) 为第一个矩形第一次到第二个矩形时碰到的是 \((x,y)\) 的方案数,这其实等价于若 \((x-1,y),(x,y-1)\) 这两不在矩形内就可以转移,要求 \((x,y)\) 是左/上边界,\(g(x,y)\) 为第二个矩形到 \((x,y)\) 的方案数,要求 \((x,y)\) 是右下边界,定义类似 \(f\),这两个如果不是边界就是零,则答案也等于:

\[\sum_{X_3\le x_0\le x_1\le X_4}\sum_{Y_3\le y_0\le y_1\le Y_4}f(x_0,y_0)g(x_1,y_1)(x_1+y_1-x_0-y_0+1){x_1+y_1-x_0-y_0\choose x_1-x_0} \]

考虑 \(f,g\) 都可以 \(O(V)\) 求出,那么考虑优化:

其实我们发现:

\[\begin{aligned} &\sum_{X_3\le x_0\le x_1\le X_4}\sum_{Y_3\le y_0\le y_1\le Y_4}f(x_0,y_0)g(x_1,y_1)(x_1+y_1-x_0-x_1+1){x_1+y_1-x_0-y_0\choose x_1-x_0}\\ =&\sum_{X_3\le x_0\le x_1\le X_4}\sum_{Y_3\le y_0\le y_1\le Y_4}f(x_0,y_0)(-x_0-y_0)g(x_1,y_1){x_1+y_1-x_0-y_0\choose x_1-x_0}+f(x_0,y_0)(x_1+y_1+1)g(x_1,y_1){x_1+y_1-x_0-y_0\choose x_1-x_0}\\ =&\sum_{x_0=X_3}^{X_4}\sum_{y_0=Y_3}^{Y_4}f(x_0,y_0)(-x_0-y_0)[(x_0,y_0)\to (X_5,Y_5,X_6,Y_6)]+\sum_{x_1=X_3}^{X_4}\sum_{y_1=Y_3}^{Y_4}g(x_1,y_1)(x_1+y_1+1)[(X_1,Y_1,X_2,Y_2)\to (x_1,y_1)] \end{aligned} \]

这枚举边界是 \(O(V)\) 的,足以通过本题。

最后一步转换等价于组合意义,枚举 \((x_0,y_0)\) 进入后通过哪个点离开,参数分离之后其实就是点到矩形方案数。

数学公式推导,注意整体性参变分离推导有意义性(明确感知无法封闭的结论需要跳过),及时意识 到当前结论已经够用。

及时梳理已有结论。

F

这个题太经典啦!

容易发现一个必要条件是 \(A,B\) 两树上 \(x\) 的儿子个数奇偶性相同。

换句话说也就是建立一个大根 \(rt=n+n+1\),将 \(B\) 树上的点编号全部加 \(n\),这样 \(\forall i\in [1,n]\cap Z,deg_{i}\equiv deg_{i+n}(\bmod 2)\)

其次可以发现答案用到的数字应该属于 \(\lbrace -1,0,1\rbrace\)

其中 \(1,-1\) 用于平衡点权和,而 \(0\) 用于继承(当儿子点权和是 \(1,-1\) 的时候继承,否则用 \(1,-1\) 去修正)。

一个很妙的地方是 \(deg_i\bmod 2=1\),则将 \(i,i+n\) 连边,这样每个点度数都是奇数,说明存在欧拉回路

其实可以想象成一个走路问题:若 \(deg_i\bmod 2=0\),则说明子树里走入走出次数相同,否则走入走出次数相差 \(1\),这个将由根节点的边弥补。

严谨一点是欧拉回路可以拆为若干不相交的环,环有三类:

  • 走向儿子,并且从横叉边或者子树回来

    这类边没有贡献

  • 走向儿子,并从父亲回来

    这类边会产生 \(1\) 的贡献

  • 走向父亲,并从儿子回来

    这类边会产生 \(-1\) 的贡献

第二三类环对于一个点只有一个,因为到父亲的边只有一个。

因此证明了正确性。

AGC019

A

由于是二进制,直接贪即可。

B

注意到若翻转后与原串不同那么一定是一个新串(除掉包含情况),两个翻转后的串相同则它们一定同时等于原串。

考虑一对区间 \([l,r]\),若 \(a_l=a_r\) 是一定会算重的,且一定不会算漏,\(O(n)\) 统计 \(a_l=a_r\) 的个数即可。

C

只考虑在起点终点矩形之内的点。通过坐标翻转钦定起点是左下角,终点是右上角。

我们考虑走半圆更优于走路,有 \(5\pi-20\) 的量。

然后注意到每行每列至多一个圆,那么我们求一个 LIS 就可以求得最佳减少量(去掉起终点)。

但是如果遇到 LIS 长度为 \(\min(dx,dy)+1\) 的时候(也就是圆将图分割成了两半)显然有一个额外的 \(5\pi\) 代价。

D

考虑一个暴力:枚举最终状态,枚举最大往左/往右走距离,检验,这是 \(O(n^4)\) 的,精细实现有 \(O(n^3)\)

考虑优化,枚举最终状态,然后注意到最大往左减小的时候最大往右需要增大,我们双指针扫描即可。

具体细则是求出每个点要合法的最少向左向右距离,首先将 \(l=n-1,r=0\) 的状态处理了,然后 \(l\) 减小,记录每个点,其是否已经合法,那么在 \(l\) 减小合法量减少的时候增加 \(r\) 即可。

最后枚举先走 \(l\) 还是先走 \(r\),同时对其所到达的终态到枚举的终态的距离再算上。

E

考虑每一个 \(1\) 的行踪轨迹,将其看作一张图,手摸可以发现要么是一个环,要么是一条链。

也即操作的每一时刻(\(A\) 已经更新),若 \(A_{a_i}=A_{b_i}=1\),则这一次是没有意义的。可以随意放置于链/环的任意位置,若出现了 \(A_{a_i}=0,A_{b_i}=1\) 的情况就死了。

如果我们删掉所有的这样的操作,只保留 \(A_{a_i}=1,A_{b_i}=0\) 的情况,会发现整个过程是若干条对应关系(也就是看作边 \(a_i\to b_i\))。

如果是观察操作序列,那么最终会出现一些操作环,\(a_i\to b_i(a_j)\to b_j\to …\to a_i\),这样的一整串都必须要满足初始值全都有 \(A_{a_i}=A_{b_i}=1\),这个看都看的出来。

还有一些操作链,他们全部由 \(A_{a_i}=1,A_{b_i=0}\) 起手往下走,然后后面的情况全是遇到双 \(1\),最后以一个 \(01\) 结尾。(注意这可能会变化,但是我们只需要记录当前操作时刻还可用的就行了)

注意到设 \(S\)\(10\) 的个数,\(01\) 的个数显然也是 \(S\),然后设 \(T\)\(11\) 的个数 ,设 \(f_{i,j}\) 为用了 \(i\)\(T\) ,组成 \(j\) 个链的方案(也相当于用了 \(j\)\(S\)),显然有 \(f_{i,0}=(i!)^2\)

\(f_{0,0}=1\)

  • 当前我们考虑加入一个 \(S\),那么就会多一条链,考虑所有链的链尾可以匹配 \(j+1\) 个,而 \(j+1\) 个链需要顺序,所以有 \(f_{i,j}·(j+1)^2\to f_{i,j+1}\)

  • 当前我们考虑加入一个 \(T\),先为它选择一条链(拼接方案),然后为它选择一对数字(相对其他 \(T\),也就是 \(a_i,b_i\) 的配对是谁,但是是相对的),\(f_{i,j}·(i+1)j\to f_{i+1,j}\)

然后考虑枚举有 \(K\)\(T\) 自己成环,首先需要选出 \({T\choose K}\),其次需要选择 \(K\) 条边在所有的 \(S+T\) 条中。(注意我们开链的时候已经计算了 \(S+T\)\(S\) 所对应的另一端的编号),也就是 \({T+S\choose K}\),最后还有有链方案数,\(f_{S,T-K}\),还需要有顺序和对应关系,也就是 \((K!)^2\)

所以答案是 \(\sum_i {T\choose i}{T+S\choose i}(i!)^2f_{S,T-i}\)

F

显然每次会选大的,我们默认 \(n\le m\),考虑每一步的贡献:

\[ \begin{aligned} Ans·{n+m\choose n}&=\sum_{i,j}{i+j\choose i}{n+m-(i+j)\choose n-i}\frac{\max(i,j)}{i+j}\\ &=\sum_{i,j}{i+j\choose i}{n+m-(i+j)\choose n-i}\frac{i+j-\min(i,j)}{i+j}\\ &=\sum_{i,j}{i+j\choose i}{n+m-(i+j)\choose n-i}-\sum_{i,j}{i+j\choose i}{n+m-(i+j)\choose n-i}\frac{\min(i,j)}{i+j}\\ &=(n+m+1){n+m\choose n}-\sum_{k=1}^n\sum_{i\ge k,j\ge k}{i+j\choose i}{n+m-(i+j)\choose n-i}\\ &=(n+m+1){n+m\choose n}-\sum_{k=1}^n\sum_{s=2k}^{n+m}\sum_{i=k}^{s-k}{s\choose i}{n+m-s\choose n-i}\\ \end{aligned} \]

\(S(k)=\sum_{i\ge k,j\ge k}{i+j\choose i}{n+m-(i+j)\choose n-i}\\\)

其实可以看作 \((k,k)\to (n,m)\) 矩阵中从 \((n,m)\) 出发到 \((0,0)\) 且算上了路径长度。

考虑类比AGC018E,枚举边界(最后一步走出矩形来计算)

有:

\[ \begin{aligned} S(k)&=\sum_{i=k,j>k}(n+m-i-j+1){n+m-i-j\choose n-i}{i+j-1\choose j-1}+\sum_{i>k,j=k}(n+m-i-j+1){n+m-i-j\choose n-i}{i+j-1\choose i-1}+(n+m-2k+1){n+m-2k\choose n-k}{2k\choose k}\\ \end{aligned} \]

不行了太复杂了推不下去,但是一定是可以作出一个 \(O(1)\) 的式子的。

也就是有时间和耐心可以弄出来的。(或许可以尝试打表/猜测)

好吧事实上弄出来若 \(n\le m\)\(\sum S(k)=n{n+m\choose n}+\frac{1}{2}\sum_{k\ge 0}{n+m-2k\choose n-k}{2k\choose k}(1+[k=0])\),也就是特别处理 \((0,0)\) 之后,枚举 \(k:1\to n\),每次算出来都是 \(S(k)={n+m\choose n}+\frac{1}{2}{n+m-2k\choose n-k}{2k\choose k}\)。其实是因为对称性大大简化了式子的推算。

不过我们再考虑组合意义呢?

如果考虑对角线,容易发现如果走离对角线之后就是一个对称的过程了

对角线上方需要向下走,对角线下方需要向左走就会有贡献

那无论怎么走,如果 \(n\le m\) 一定会有一个 \(m\) 的贡献,具体地没有过对角线显然成立,过了对角线之后完全对称也显然成立。

唯一剩下的问题是对角线那里会有特别贡献。

也就是 \(i=j\) 的时候能猜对多少,显然是 \(\frac{1}{2}\) 乘以情况总数。

所以可以给出答案 \(\sum_{k\ge 1}\frac{1}{2}{n+m-2k\choose n-k}{2k\choose k}\)

所以答案是 \(m+\frac{1}{2{n+m\choose n}}\sum_{k\ge 1}{n+m-2k\choose n-k}{2k\choose k}\)

令我们惊讶的是,这个结果似乎异常简洁,妙啊。

AGC020

A

根据 \(A-B\) 奇偶性判断即可。

B

倒推,显然维护每次的最大值和最小值是最优的。

也就是 \(l,r\)\(l'\leftarrow l+(a_i-l\bmod a_i)\bmod a_i,r'=r+(a_i-(r\bmod a_i)-1)\)

C

根据对称性,设 \(S=\sum a_i\),则有若 \(T\) 出现过则 \(S-T\) 出现过。

所以答案是第一个 \(\ge \lceil\frac{S}{2}\rceil\) 的可以凑出来的和。

bitset 优化 \(01\) 背包即可。

D

显然 \(k=\lceil\frac{\max(A,B)}{\min(A,B)+1}\rceil=\lfloor\frac{A+B}{\min(A,B)+1}\rfloor\)

一个显而易见的贪心策略是我们能尽量在当前合法且后面有方案使他合法的情况下放 \(A\)

所以答案应当呈现这个形式:

  • 第一段:\(k\)\(A\) 和一个 \(B\)
  • 第二段:尽可能地放入不超过 \(k-1\)\(A\),然后放入尽量少的 \(B\) 使得 \(B\) 剩余 \(k\) 的倍数个。
  • 第三段:一个 \(A\)\(k\)\(B\)

如果我们可以找到两个分界点 \(l,r\) 就足以解决这个问题。

显然可以二分 \(l\)(第二段起点),按照第一段的策略,算出剩下的 \(A\)\(B\) 个数 \(surA,surB\),需要有 \(ksurA< surB\) 的第一个数就是 \(l\)。我们不妨将后面的一段 \(A\) 也加入进第一段方便处理,这样找到的 \(l\) 也是正确的。

我们考虑算出 \(r\)(第三段起点)。其实这是容易的,我们的 \(surA\) 对应了 \(ksurA\)\(B\),于是 \(r=l+surB-ksurA\),中间部分就是 \(B\) 了。

E

及时意识到子问题

我们设 \(g[S]\) 为字符串 \(S\) 所有子集最外层没有拼接的情况下的方案数,设 \(f[S]\) 为字符串 \(S\) 所有子集的总方案数。

显然有 \(f[S]=\sum_{i=1}^{|S|-1} g[S[1,i]]·f[S[i+1,|S|]]\)

\(g[S]\) 怎么求其所有子集的方案数。

不难发现我们枚举循环节长度 \(t\),将其变成 \(\frac{|S|}{t}\times S'[1,t]\)

容易发现 \(S'[1,t]=S[1,t]\& S[t+1,2t]\& S[2t+1,3t]……\),其所有子集要有一个 \(t\) 的循环节,则其 \(t\) 循环节都会是 \(S'[1,t]\) 的子集,所以这又是一个子问题 \(f[S'[1,t]]\)(每个循环节都要算,这相当于打括号,不重不漏)

敏锐的归纳意识,分治意识,子问题意识

F

实数计数

比较实数大小先比较整数部分再比较小数部分。

所以我们不妨 \((N-1)!\) 枚举小数部分的大小关系(根据对称性钦定哪一个最小,最小的那个小数部分是 \(0\) 是完全没有影响的),这样我们就将小数部分划为了 \(n\) 份。

而我们再决定每个点的整数部分。

所以相当于整数部分有 \(c\) 种可能,小数部分有 \(n\) 种可能,一共 \(nc\) 个点,按大小排序,那么相当于第 \(i\) 个线段的起始点 \(k\) 必须要 \(k\bmod n=i\),然后可以覆盖 \([k,k+n·len_i]\)

所以问题变成了统计有多少种合法的放置线段方案使得 $nc $ 个点都被覆盖。

这是容易的,首先我们钦定最长的那一条线段放在 \(0\),然后决定剩下的线段的位置。

不妨设 \(f_{i,j,S}\) 为已放置线段集合为 \(S\),当前最远覆盖到 \(j\),且 \(j\ge i\),当前左端点 \(\le i\) 的线段已经全部放置。

显然有:

\[f_{i,j,S}\to f_{i+1,\max(j,i+len_{i\bmod n}·n),S\cup\lbrace i\bmod n\rbrace} \]

注意最后除掉 \((N-1)!\) 以及 \(c^{N-1}\)(这是因为整数部分的轮换性)。

AGC021

A 是水题 B 几何题不做了

C

显然一个贪心是我们尽可能利用 2*2 的矩形解决两个 \(A\) 或者 \(B\)

但是这样是不够的,当 \(n\) 是奇数的时候我们优先给最后一行放 \(A\),当 \(m\) 是奇数的时候我们优先给最后一列放 \(B\),然后剩下的位置我们每个 \(2\times 2\) 的子矩形分配给 \(A,B\) 即可。

显然这样我们可以将位置利用到最大化。

但是会有 3 3 2 2 这种毒瘤情况。

所以我们还可以利用一个 \(3\times 3\) 的子矩阵解决 \(2\)\(A\)\(2\)\(B\),但是我们最多用一个,因为用了两个变成 \(3\times 6\) 或者 \(6\times 3\) 的显然可以用前面的贪心做到更优。

所以在只用上面的贪心失败的时候(\(nm\) 必须是奇数),我们就尝试拿出左下角的 \(3\times 3\) 矩阵进行尝试。

D

有神奇性质:LCS(A,rev(A))=LPS(A)

不过直接DP不就行了

对于A,rev A 暴力匹配的过程最优解必然是一个回文子序列,这是显然的,把匹配位置拿出来之后尽可能贪心把越靠近边界

那个对称过去替换另一个就可以了

枚举断点,预处理 DP 即可

也即设 \(f_{i,j,k}\)\(A[1,i],Rev(A)[1,j]\) 做LCS,改动了 \(k\) 个字符的最大匹配长度。

\(i+j\le n\),答案是 \(\max(2f_{i,j,k}+1)\)

E

很妙的转化啊

首先我们做一点基础工作,当 \(A-B\ge n\) 时显然都满足,当 \(A<B\) 时显然不满足,当 \(A=B\) 时最后一个位置必须是 B,转化为 \((A,B-1)\)

所以我们只需要解决 \(0<A-B<n\) 的情况。

有个很明显的贪心啊,最终每个龙吃的红球至多比蓝球多 1,否则我们把一个变色龙多吃的红球分出去一定不劣。

而对于吃的红球和蓝球相同的龙,它恰有 \(n-(A-B)\) 条。

而考虑极端化,这样的龙每个人最多吃两个球,也就是只会吃掉一个 AB,如果不是这样,那么我们把多的 AB 给分给多吃红球的龙一定不劣。

所以可以得到一个条件是原序列可以得出 \(n-(A-B)\)AB 就已经合法了,这显然是充分且必要的(每条吃红蓝相同个数球的龙必然存在子序列 AB)。

我们枚举 A,问题转化为求至少有 \(n-(A-B)\)AB 子序列的由 \(A\)A\(B\)B 构成的颜色序列。

用折线图来观察,其实相当于是取出起点到最低点到终点的必经路径之后其余的点都是可以配对成 AB 子序列的。

所以这条路径长度 \(-2y_d+A-B\le A+B-2(n-(A-B))\)

解得 \(y_d\ge n-A\)

这相当于将 \(1\) 看作向右走,\(-1\) 看作向上走,则 \(x-y\ge n-A\implies y\le x+A-n\) 也就是与直线 \(y=x+A-n+1\) 没有交点,根据对称的知识可以知道方案数是

\[{A+B\choose A}-{A+B\choose 2A-n+1} \]

F

\(n\le 8000,m\le 200\)

目标 \(\sum f_{m,i}{n\choose i}\)

存在递推式:

\[f_{i,j}=f_{i-1,j}+{j+1\choose 2}f_{i-1,j}+\sum_{k<j}{j+2\choose k}f_{i-1,k} \]

肯定是EGF

这里说两个技巧。

对于 \(f_{i-1,j}{j+c\choose t}\),其中 \(c,t\) 是常数的EGF构造。

考虑将其写成关于 \(F_{i-1}(z)\) 的形式,凑配系数 \(\frac{1}{t!},\frac{(j+c)!}{(j+c-t)!}\)

\(\frac{1}{t!}\) 是常数,容易的。而对于 \(\frac{(j+c)!}{(j+c-t)!}\),主要手段还是求导和平移。

考虑先处理这个下降幂中 \(\le j\) 的部分,这个通过求 \(t-c\) 次导可以做到。

然后乘 \(z\) 平移到 \(j+c\) 的位置,再求 \(c\) 次导。

所以 \(\sum f_{i-1,j}{j+1\choose 2}\) 可以写作 \(\frac{(F_{i-1}'(z)·z^2)'}{2}\)

又比如 \(\sum_{k<j}{j+2\choose k}f_{i-1,k}\) 的 EGF 也可以写成 \(e^{z}-1-z-\frac{z^2}{2}\),这是因为卷积的第 \(0,1,2\) 项是无效的(\(k<j\))。

所以:

\[\begin{aligned} f_{i,j}&=f_{i-1,j}+{j+1\choose 2}f_{i-1,j}+\sum_{k<j}{j+2\choose k}f_{i-1,k}\\ \implies F_i(z)&=F_{i-1}(z)+\frac{(F'_{i-1}(z)z^2)'}{2}+[F_{i-1}(z)(e^z-1-z-\frac{z^2}{2})]''\\ &=F_{i-1}(z)+F''_{i-1}(z)\frac{z^2}{2}+zF'_{i-1}(z)+\left(F'_{i-1}(z)(e^z-\frac{z^2}{2}-z-1)+(e^{z}-z-1)F_{i-1}(z)\right)'\\ &=F_{i-1}e^{z}+F'_{i-1}(z)(2e^{z}-z-2)+F''_{i-1}(z)(e^z-z-1)\\ \end{aligned} \]

而我们注意到\(F\) 在运算过程中只有求导,乘 \(e^k,z\) 这几个运算。

这告诉我们 \(F_x(z)=\sum_{i,j}{c_{x,i,j}z^{i}}e^{jz}\) 的形式始终成立。我们可以转为维护 \(c_{x,i,j}\),而且注意到 \(i,j\) 都在 \([0,m]\) 的范围内,大大缩小了第二维的范围,从 \(O(nm)\),变成了 \(O(m^3)\)。这里也可以在CF1842G 的EGF解法上有体现。

最后求值如何计算?

注意到答案为 \([\frac{z^n}{n!}]F_m(z)·e^z=[\frac{z^n}{n!}]\sum c_{i,j}z^ie^{(j+1)z}=[\frac{z^n}{n!}]\sum_{k}\frac{z^{i+k}(j+1)^kc_{i,j}[i+k=n]}{k!}\),可以 \(O(m^2)\) 计算。

几个运算带来的变化:

\(·z^m,c_{i,j}\to c'_{i+m,j}\)

求导:\((c_{i,j}z^ie^{jz})'=c_{i,j}(i·z^{i-1}e^{jz}+z^ie^{jz})\implies ic_{i,j}\to c'_{i-1,j},c_{i,j}\to c'_{i,j}\)

所以我们根据上面的式子可以列出转移:

  • \(F_{i-1}(z)e^z\to F_i(z),c_{i-1,x,y}\to c_{i,x,y+1}\)

  • \(F'_{i-1}(z)(2e^z-z-2)\to F_{i}(z)\)

    \(c_{i-1,x,y}(xz^{x-1}e^{yz}+yz^xe^{yz})(2e^z-z-2)\),演算得出:

    • \(-yc_{i-1,x,y}\to c_{i,x+1,y}\)
    • \(2yc_{i-1,x,y}\to c_{i,x,y+1}\)
    • \(-(x+2y)c_{i-1,x,y}\to c_{i,x,y}\)
    • \(-2xc_{i-1,x,y}\to c_{i,x-1,y}\)
    • \(2xc_{i-1,x,y}\to c_{i,x-1,y+1}\)
  • \(F''_{i-1}(z)(e^z-z-1)\to F_i(z)\)

    \(c_{i-1,x,y}(z^xe^{yz})''(e^z-z-1)\to c_{i-1,x,y}(x(x-1)z^{x-2}e^{yz}+2xyz^{x-1}e^{yz}+y^2 z^xe^{yz}))(e^z-z-1)\)

    • \(x(x-1)c_{i-1,x,y}\to c_{i,x-2,y+1}\)
    • \(2xyc_{i-1,x,y}\to c_{i,x-1,y+1}\)
    • \(y^2c_{i-1,x,y}\to c_{i,x,y+1}\)
    • \(-(x(x-1)+2xy)c_{i-1,x,y}\to c_{i,x-1,y}\)
    • \(-(y^2+2xy)c_{i-1,x,y}\to c_{i,x,y}\)
    • \(-y^2c_{i-1,x,y}\to c_{i,x+1,y}\)
    • \(-x(x-1)c_{i-1,x,y}\to c_{i,x-2,y}\)

综合上述信息,我们有:

  • \(-(x+2y+y^2+2xy)c_{i-1,x,y}\to c_{i,x,y}\)
  • \(-(y+y^2)c_{i-1,x,y}\to c_{i,x+1,y}\)
  • \(-(x^2+2xy+x)c_{i-1,x,y}\to c_{i,x-1,y}\)
  • \(-x(x-1)c_{i-1,x,y}\to c_{i,x-2,y}\)
  • \((y^2+2y+1)c_{i-1,x,y}\to c_{i,x,y+1}\)
  • \((2xy+2x)c_{i-1,x,y}\to c_{i,x-1,y+1}\)
  • \(x(x-1)c_{i-1,x,y}\to c_{i,x-2,y+1}\)

转移即可。

AGC 023

E

考虑所有的排列个数,这很简单,将 \(A\) 排序之后即为 \(\prod_{i=1}^n(a_i-i+1)\)

那么考虑计算 \(p_i>p_j,i<j\)\(p\) 个数,相当于去掉 \(a_i,a_j\)\(\prod\) 里的贡献

其实可以看做去掉了 \(a_i,a_j\),并将 \(\ge p_i\)\(a\) 减掉 \(1\),将 \(\ge p_j\) 的减掉 \(1\) 之后重排的答案?

但是这个减掉本身会导致排名下降也会导致值下降,其实是不变的?不变个锤子,\(p_i,p_j\) 是枚举的确定值。

考虑具体给它写出来,我们令 \(b_i\)\(a_i\) 排序后的排名,排序后的 \(a\)\(c\)

枚举 \(i,j\) 位置是什么,那么转化为对 \(n-2\) 的排列进行计数。

\(a_i<a_j\) 时,

相应的 \(a\) 值有变化,对于排名高于 \(a_i\) 的数字,对于原本的式子,其每个位置的计算方法是不变的,有影响的只有 \([i+1,j-1]\) 这一部分值,它们的可取集合会变少 \(1\)(因为 \(j\) 填的数字小于 \(i\)

本质上的计算是不变的吧,只是说排名有变化,而 \(a\) 值亦有变化

\[\begin{aligned} f(i,j)&=\sum_{x}^{}\sum_{y}^{}[x>y]\prod_{k\neq i,k\neq j}(a_k-b_k+1-[a_k\ge a_i]-[a_k\ge a_i]+[b_k>b_i]+[b_k>b_j])\\ &=\sum_{x}^{}\sum_{y}^{}[x>y]\prod_{k\neq i,k\neq j}(a_k-b_k+1-[b_i<b_k<b_j])\\ &=\sum_{x}^{}\sum_{y}^{}[x>y]f(n)·\frac{1}{(a_i-b_i+1)(a_j-b_j+1)}·\prod_{k=b_i+1}^{b_j-1}\frac{a_k-b_k}{a_k-b_k+1}\\ &=\frac{(a_i-b_i+1)(a_i-b_i)}{2(a_i-b_i+1)(a_j-b_j+1)}f(n)·\prod_{k=b_i+1}^{b_j-1}\frac{a_k-b_k}{a_k-b_k+1}\\ &=\frac{(a_i-b_i)}{2(a_j-b_j+1)}f(n)·\prod_{k=b_i+1}^{b_j-1}\frac{a_k-b_k}{a_k-b_k+1} \end{aligned} \]

最后一步是因为 \(x\) 仅有 \((a_i-b_i+1)\) 种取法,而 \(y\)\(x\) 的取值集合在任意时刻相同。

\(a_i>a_j\) 时,

其实这个相当于交换 \(i,j\) 位置之后求顺序对数量,所以有:

\[f(i,j)=f(n)-\frac{(a_j-b_j)}{2(a_i-b_i+1)}f(n)·\prod_{k=b_j+1}^{b_i-1}\frac{a_k-b_k}{a_k-b_k+1} \]

\(a\) 变成 \(c\),维护一个 \(pos\) 表示原本位置,那相当于是:

\(pos_i<pos_j,i<j\)

\[f'(i,j)=\frac{c_i-i}{2(c_j-j+1)}f(n)\prod_{k=i+1}^{j-1}\frac{c_k-k}{c_k-k+1} \]

\(pos_i>pos_j,i<j\)

\[f'(i,j)=f(n)-\frac{c_i-i}{2(c_j-j+1)}\prod_{k=i+1}^{j-1}\frac{c_k-k}{c_k-k+1} \]

发现后面的式子形式是没变的,考虑以 \(i\) 为基准计算。

显然 \(c_i-i\) 是可以拿出来的,而 \(\frac{1}{c_j-j+1}\) 是可以初始化的,后面是可以区间乘的。

但是 \(pos\) 是不太好处理的。

我们不妨考虑 \(i\) 减小时插入到 \(pos\) 这个位置去,然后变成全局乘(无效的位置是零),单点赋值,然后左半部分是减,右半部分是加。

维护区间和。

一颗支持区间乘,单点加,区间求和的线段树即可。

F

考虑到如果一个点的父亲没了,那么当前的可以操作的 \(0\) 肯定立刻接上去。

那么就可以使用合并贪心的技巧,维护当前最优的元素立刻将其与父亲节点合并并更新父亲的权值。

而我们如何合并?考虑一个点当前代表 \(a_0,a_1\)\(0/1\),则 \(a\) 优于 \(b\) 显然有 \(a_1b_0<a_0b_1\),也即是取当前 \(\frac{a_1}{a_0}\) 的最小值。

\(a_0=0\) 设置为无穷大。

用一个 multiset 存下每个点的初始权值(除了根节点),利用并查集处理合并即可。

ARC 系列

本周目标:ARC104~ARC106

第二轮目标:ARC058~ARC090 E&F

ARC058

E

不妨考虑以第一次合法的位置来计数。

这样后面是可以任意填的

设计一个DP \(f_{i,0/1/2,c,S}\)\([1,i]\) 现在正在填哪一部分(\(X/Y/Z\),当前最后有 \(c\) 个数字依次压缩在 \(S\) 里)

然后将这个状态就合法的状态拿出来变成第一次合法位置的方案数,然后将其清空

后面就随便填了,这就容易了。

能切到下一个状态就切,会不会重?当前状态失败了之后如何回撤?

你只需要知道最后的和 \(\le 7\) 的几个状态就可以重新回到 \(X\) 开始了。

这玩意显然爆标了,肯定不对

应当是不够的,你维护一个极长的 \(\le X+Y+Z\) 的后缀状态行不行

\(X+Y+Z\le 17\),一共 \(130642\) 个。

然后每次检验这个后缀是否合法,合法了就清零算。

这玩意显然能过。。。

woc,正解很有意思很优雅啊这个状压,状压前缀和出现状态。

也即是状压 \(f_{i,S}\) 为以 \(i\) 为末尾的后缀和的前缀和出现状态。

只需要要求第 \(X,X+Y,X+Y+Z\) 位是 \(1\) 即可。

F

过于困难,已经不想写了。

显然有个 \(O(nk)\) 的背包在,如何 \(O(1)\) 解决比较两决策的问题

你考虑到一个 \(f_{i,j_0},f_{i,j_1}\) 表示的串,如果在之后已经确定后面的串搞不出来答案串那肯定废了直接扔掉

那么对于有用的串,\(j_0<j_1\) 显然一定满足 \(j_0\)\(j_1\) 的前缀

所以只需要维护最大的有效 \(f_{i,j}\) 这个串即可。

字符串字典序最优化问题比较DP决策

ARC059

E

显然设 \(f_{i,j}\) 为 前 \(i\) 个人 \(j\) 个糖果,根据乘法分配律有:

\(f_{i,j}=\sum_{k=0}^jf_{i-1,j-k}\sum_{x=A_i}^{B_i}x^k\)

预处理后即可 \(O(NCV)\) 解决。

F

显然和原字符串没关系,所以可以设 \(f_{i,j}\)\(i\) 次操作后长度是 \(j\) 的方案数,显然有 \(f_{i,j}=2f_{i-1,j+1}+f_{i-1,\max(j-1,0)}\)

ARC060

F

如果原串的最小循环节 \(\ge 2\),则全场最佳的元素数量至多是 \(2\),一个很显然的构造是拿走最后一个自立门户

如果是 \(2\),那显然拿出非循环节断点的都可以吧

但是你分裂之后可能出现一些我谔谔的情况,但是你判掉非法的(只需要前后缀一次KMP即可)就行了

首先判掉全串所有字符相同,然后判掉全串无循环节,然后只需要正着倒着做两次KMP,枚举端点判断即可。

ARC061

F

貌似不太难的样子

首先 \(b,c\) 对称,不妨假定 \(M\le K\)

考虑一个暴力 \(dp\),设 \(f_{i,j,k,0/1/2}\) 为当前为 \(A/B/C\) 操作,还各自剩下 \(i,j,k\) 牌最后 \(a\) 获胜的方案数。

显然有如下关系:

\[\begin{cases} f_{i,j,k,0}=f_{i-1,j,k,0}+f_{i-1,j,k,1}+f_{i-1,j,k,2}\\ f_{i,j,k,1}=f_{i,j-1,k,0}+f_{i,j-1,k,1}+f_{i,j-1,k,2}\\ f_{i,j,k,2}=f_{i,j,k-1,0}+f_{i,j,k-1,1}+f_{i,j,k-1,2}\\ f_{0,j,k,x}=3^{j+k}·[x=0] \end{cases} \]

上面三个式子都是在 \(i,j,k\ge 1\) 的情况下进行的。

则我们不妨令 \(f_{i,j,k}=f_{i,j,k,0}+f_{i,j,k,1}+f_{i,j,k,2}\),我们所求即为 \(f_{N,M,K,0}=f_{N-1,M,K}\)

且 DP 式改写为 \(f_{i,j,k}=f_{i-1,j,k}+f_{i,j-1,k}+f_{i,j,k-1}\)。这显然是一个三维空间走路的模型。

那么对于一个 \(f_{0.j,k}\) 而言其对 \(f_{N-1,M,K}\) 的贡献系数是 \({N-1+M+K-j-k\choose N-1,M-j,K-k}\)

所以我们得到所求为:

\[\begin{aligned}\\ f_{N-1,M,K}&=\sum_{j=0}^M\sum_{k=0}^K3^{j+k}{N-1+M+K-j-k\choose N-1,M-j,K-k}\\ &=\sum_{s=0}^{M+K}3^s\sum_{j\in[0,M]\cap[s-K,s]}{N+M+K-1-s\choose N-1,M-j,K-s+j}\\ &=\sum_{s=0}^{M+K}3^s{N+M+K-1-s\choose N-1}\sum_{j\in[0,M]\cap[s-K,s]}{M+K-s\choose M-j}\\ &=\sum_{s=0}^{M+K}3^{M+K-s}{N+s-1\choose N-1}\sum_{j\in[0,M]\cap[s-K,s]}{s\choose j} \end{aligned} \]

我们考虑快速计算 \(\sum_{j\in[0,M]\cap[s-K,s]}{s\choose j}\)

注意到 \(j\in [0,M]\cap [s-K,s]=[0,M]+[0,K]-[0,s]\)

所以我们的问题其实变为快速求出 \(\sum_{j\le up}{s\choose j}\)

不妨设这个东西是 \(f(s,up)\),则根据帕斯卡公式我们有:

\[f(s,up)+f(s,up)-{s\choose up}=f(s+1,up) \]

所以我们后半部分可以 \(O(n)\) 递推就做完了。

ARC062

F

考虑点双,每个vdcc内部不同构的方案数是独立的,最终答案是其乘积,原因是各个点双之间互不影响,且乘法分配律构造出所有方案。

对于 \(|V|=2,|E|=1\) 的点双,方案显然是 \(k\)

对于 \(|E|>|V|\) 的点双,对于两个环通过边接在一起可以实现任意交换(共边是垃圾桶,可以实现只交换两个边颜色),那么所有颜色出现次数不同的方案数才本质不同,所以共有 \({|E|+k-1\choose |E|}\)

对于 \(|E|=|V|\) 的点双,就是 polya 定理的模板,有 \(\frac{1}{|E|}\sum_{d| |E|}k^d\varphi(\frac{|E|}{d})\)

ARC063

E

显然可以通过求解一些限制,例如求出 \(rt\to v\) 的自由边数量以及 \(-1\) 边所需量,从根开始往下构造

但是更直观的是全局的最小值旁边的点不可能比他小,于是优先队列模拟即可,遇到非法就无解,显然这个构造是对的。

F

很有意思啊。

首先考虑这个操作是在干嘛,模拟一下会发现只会剩下一个白色矩形。

而且这个白色矩形的四个边界都有特殊点且内部没有(内部有就废了)。

同时我们可以说明任意一个这样的白色矩形是可以取到的,根据点与矩形的相对位置就可以拿出。

所以问题转化为 找到一个周长最大的矩形使得其内部(不含边界)不包含给定点

首先由于题目给定的是点,而我们需要的是矩形,所以一定是可以拿出一个 \(2\max(H,W)+2\) 周长的矩形的。

而根据这个式子,答案至少不劣于这个,所以行列里面至少有一个不短于 \(\frac{\max(H,W)+1}{2}\)

这说明有贡献的矩形必然会满足过 \(x\) 或者 \(y\) 中线,当然也可能全过。

那么我们先只考虑 \(y\) 中线,\(x\) 中线可以通过反转 \(x,y\) 坐标来求。

考虑我们已经确定了 \(x_l,x_r\) 的话,我们只考虑 \(x\in [x_l,x_r]\)\(y\le y_{mid}\) 的最大值和 \(>y_{mid}\) 的最小值。

我们将其表述为 \(yl_{\max},yr_{\min}\)

\(x_l,x_r\) 的贡献就是 \(2[(x_r-x_l)+(yr_{\min}-yl_{\max})]\)

考虑对 \(x_r\) 进行扫描线,可以使用线段树和单调栈技术处理 \(yr_{\min}-yl_{\max}-x_l\) 的值,用区间加,全局最大值的线段树即可。

边界细节很多,还需要离散化,需要注意。例如 \((x,y)\) 的限制生效时 \(xl<x\) 是严格的。

ARC064

F

其实感觉很显然吧。对于一个回文串如果有循环节那么一定也是回文串。

而根据循环节的特殊性,如果循环节长度是奇数的那么一定是可以 \(len\) 次循环不同,而如果是偶数就是 \(\frac{len}{2}\) 因为循环一半就是一个回文串了。

那么就很套路的,设 \(f(d)\) 为最小循环节为 \(d\) 的方案数,\(g(d)\) 为存在长度为 \(d\) 的循环节的方案数。

根据莫比乌斯反演有 \(f(n)=\sum_{d|n}g(d)\mu(\frac{n}{d})\),而 \(g(d)\) 显然为 \(k^{\lceil\frac{d}{2}\rceil}\)

而答案计算也是简单的,\(\sum d·f(d)·(\frac{1}{2}+[d\bmod 2=1]\frac{1}{2})\)

于是就可以 \(O(d^2(n))\) 计算了。

ARC065

E

代码能力题。

首先,问题可以变成这样子:求出所有的 \(deg_x=\sum [dis(x,y)=dis(a,b)]\)

不妨设 \(dis(a,b)=D\)

然后对于 \(dis(x,y)=dis(a,b)\),建立边 \((x,y)\),求出 \(a\) 所在连通块的 \(deg\) 和,这个值除以二就是答案。

计算方法是简单的,你考虑 转化切比雪夫简化计算,当然不转也能做。也就是 \(x_i'=x_i+y_i,y_i'=x_i-y_i\)

然后 \(deg_i\) 可以看作两个矩形 \((x'_i-D,y'_i-D,x'_i+D,y'_i+D),(x'_i-D+1,y'_i-D+1,x'_i+D-1,y'_i+D-1)\) 内部点的个数差,这个可以扫描线轻松做到(偷懒可以主席树)。

接着我们考虑求出这个连通块内点。

可以建立一个队列,初始放入 \(a\),对每个 \(x\) 坐标开一个 \(set\),每个 \(y\) 坐标开一个 \(set\)

取出队头 \(u\) 时,显然可以分四个边界枚举下一个点 \(v\),我们利用 \(set\) 进行寻找,寻找到一个就删除即可。

当前你做什么优化建图之类的都行。

利用每个点至多松弛一次的性质做隐式建图,拿出一个点后就直接删除,那么只需要 $n\times $ 每次查点的复杂度即可处理连通性

复杂度均摊 \(O(n\log n)\)

F

显然区间包含可以去掉,那么现在 \(R\) 递增了。

考虑把 \(L\) 放到位置里,可以变成 \(\forall i,L_i,R_i\) 满足两者皆不降表示可操作范围

其实就是前缀 \(max\)。(也即先初始化 \(R_i=i\),然后对于输入的每一对 \(l_i,r_i\)\(R_{l_i}\)\(r_i\)\(\max\),然后做一个 \(R\) 的前缀 \(max\)

考虑到对于 \(i\) 而言,\([R_i+1,n]\) 是不变的,所以可以设 $f_{i,j} $ 为操作到了 \(i\)\([1,i]\) 放了 \(j\)\(1\) 的方案数。那么可以得到 \(c=S_R-j\) 表示 \([i+1,R]\) 剩余 \(1\) 个数,判断能不能放,以及是不是必须放即可。

也即当 \(c<0\) 或者 \(c>R-j\) 时状态 \(f_{i,j}\) 非法,为零,否则 \(f_{i,j}=f_{i-1,j}+f_{i-1,j-1}\)

答案为 \(f_{n,S_n}\)

ARC 066

E

考虑到我们只可能在 \(-\) 后面加括号。

所以考虑设 \(f_{i,j}\)\([1,i]\) 当前还有 \(j\) 个左括号没有匹配的最优解

我们讨论当前符号以及放不放左括号转移:

答案是 \(f_{n,0}\)

你说第二维能不能用 \(0/1\) 替代,但是你不知道能不能去掉括号。

噢,但是多层括号可以被至多两层替代掉。。。

那就完了,完了。

最多两层括号就可以涵盖所有的情况。

\(f_{i,j}\) 为前 \(i\) 个位置有 \(j\) 层括号嵌套,分类讨论转移即可。

(这里是加号,讨论一下前面那个位置放若干个)的情况,如果是减号,讨论 )(,)_ ,_(,__ 四种情况。然后你还可以选择前面多添几个 \()\)

F

初始化给我创破防了

考虑到原题本身4是给出 \(t_1\sim t_n\),支持 \(m\) 次单点修改(临时),求修改后的最优解。

显然不考虑修改时候会有一个暴力的可斜优的DP,令 \(s\)\(t\) 的前缀和:

\(f_{i}=\max(f_{i-1},f_{k}+s_k-s_i+\frac{(i-k)(i-k+1)}{2})\)

最大化截距,所以是上凸壳,斜率递减

又由于所求斜率是 \(i\) 递增,所以应该是尾插尾查

考虑修改,分类讨论,如果最终不取修改的点,我们正着倒着做一次 \(dp\) 就可以计算了。

如果要取,一个暴力的想法是枚举区间,然后算答案。

那么修改 \(x\) 取区间 \(l,r\) 的答案是 \(pre_{l-1}+suf_{r+1}-s_r+s_{l-1}+\Delta+\frac{(r-l+2)(r-l+1)}{2}\)

我们的目标就是找到最优的这个区间。

发现可以拿出 \(\Delta\),把 \(+s_r,-s_{l-1}\) 与其合在一起,\((r-l+2)(r-l+1)=r^2+l^2-2lr+3(r-l)+2\),拿出常数,然后单个变量加入 \(pre/suf\),就可以变成求 \(w(l,r)=a_l+b_r-lr,i\in [l,r]\) 的最值了。

然后就变成了对于每个 \(i\) 寻找最优 \(l,r\)

或者说是求出一个 \(h_i\) 表示最优解。

套路地考虑分治,求出每个 \(l\) 对应的最优 \(r\),每个 \(r\) 对应的最优 \(l\) 然后做前后缀 \(\max\) 来算

也就是一个 \(l\) 可以贡献 \(i\in [l,mid]\)\(r\) 可以贡献 \(i\in [mid+1,r]\)

设当前分治区间 \([L,R],mid\),一半的步骤是我们枚举 \(l\)

\(a_l+b_r-lr\),也是最大化截距,所以是上凸壳,斜率递减。

先建立出来,然后 \(l\) 从小到大的过程中可以做尾删。

我们枚举 \(r\) 的时候也是上凸壳,\(r\) 从小到大可以做尾删。

注意在这里维护每个 \(l\) 全局的最优 \(r\) 是错误的,我们应当是维护 \(\ge i\) 的最优 \(r\),所以才会考虑分治计算

\(O(n\log n)\)

  • 临时单点修改,考虑维护不取的最优值和取了后的最优决策(由于钦定取了,贡献独立的情况下是不会影响的)
  • 分清楚你要干嘛,你的截距是最终的贡献,最大化截距是上凸壳
  • 分治可以强行加上/消去偏序关系

ARC 067

这场着实是简单了

E

考虑暴力 DP,设 \(f_{i,j}\) 为已经放完了人数 \(\le i\) 的组,一共用了 \(j\) 个人的方案数。

则显然有几种决策:

  1. 不加组,方案数是 \(f_{i-1,j}\)

  2. \(i\in [A,B]\),则可以加入 \([C,D]\) 组,也就是有

    \[\sum_{k=C}^{D,ki\le j}f_{i-1,j-ik}·{n-j+ik\choose ik}{ik\choose i,i,\dots i}·k!=\sum_{k=C}^{D,ki\le j}f_{i-1,j-ik}·\frac{(n-j+ik)!}{(n-j)!(i!)^k}·k! \]

F

一个暴力是可以直接枚举最终会走到 \([l,r]\),然后每个票肯定去最优的那个位置使用,我们先预处理出 \(s_i\) 表示 \(1\to i\) 的距离。

也就是相当于求:

\[\max_{l,r}s_r-s_{l}+\sum_{i=1}^m\max_{j=l}^rb_{j,i} \]

这个显然可以用 \(m\) 个单调栈配合区间修改线段树做扫描线求解。

ARC 068

E

直接对于每种车统计贡献即可,其贡献范围可以数论分块结合差分。

F

一个 双端队列 按照 \(1\sim n\) 的顺序每次放入队列,可以头插可以尾插,这样的序列是一个单谷序列,也就是 \(1\) 前面递减后面递增

那么由于要求 \(1\) 是第 \(k\) 个被拿出的,则 \(n-k-1\) 个拿的时候都可以自由选择,所以肯定有一个 \(2^{n-k-1}\) 乘上去。

然后考虑这个取出序列,它其实就满足第 \(k\) 项是 \(1\),然后可以划分为两个递增序列即可。

考虑 Dirworth 定理,这相当于是根据偏序关系连边后可以划分为最多两条链,也就是反链不超过 \(2\),这等价于不存在三个递增的数字。

由于中间项比较难搞,考虑逆排列,原本三个递增的数字逆排列同样递增,那么也同样满足。

那么我们求解原序列的逆排列,显然有不超过三个递增的数字且第一项是 \(k\),全局最大值。

\(f_{i,j}\) 为长为 \(i\) 的排列首项为 \(j\) 的合法排列个数,显然有:

  • \(j=1:f_{i,j}=f_{i-1,j}=1\)

  • \(i=j:f_{i,j}=\sum_{k<j} f_{i-1,k}\)

  • \(i>j:\) 此时其实原本的首项只能够是 \(i\) 或者小于 \(j\) 的数字,也就是:

    \(f_{i,j}=\sum_{k\le j} f_{i-1,k}\)

再推一下:

  • \(f_{i,i}=f_{i,i-1}\)
  • \(f_{i,j}=f_{i,j-1}+f_{i-1,j}\)

景点走格子 \(dp\) 即可。

可以推得通项是 \(f_{n,k}={n+k-3\choose n-2}-{n+k-3\choose n}\)

所以答案是 \(2^{n-k—1}·f_{n,k}\)

ARC 069

E

考虑一个贪心,我们最终序列里的数字一定是非严格递减的,且能减就减。

那么我们把当前编号最小的最大值削成次大值,并且把与其相同大小是数字也削成次大值。

接着继续找新的最大值,显然就满足了最终序列的数字非严格递减且能减就减。

那么设 \(cnt_i\) 为值为 \(i\) 的数的出现次数,\(id_i\) 为其第一次出现位置(未出现设置为 \(\inf\)

从最大值开始倒序枚举,每次将 \(id_i\) 的出现次数加上 \(cnt_i\),然后将 \(cnt_{i-1}\leftarrow cnt_i,id_{i-1}\leftarrow\min(id_i,id_{i-1})\)

离散化加速计算即可。

F

显然可以二分答案结合2-sat,利用数据结构(线段树,ST表等优化建图即可),注意 \(i\) 不能连到 \(i'\),所以对于值相同的数,做一个前后缀优化特殊处理即可。

ARC 071

070是交互不想动

F

容易发现如果有两个挨着的数大于 \(1\),则后面的数就确定了,这启发我们倒序计算。

\(f_{i}\) 为填完 \([i,n]\) 的方案数,显然有 \(f_n=n,f_{n-1}=n^2\)

  • \(a_i=1:f_{i+1}\)
  • \(a_{i}>1,a_{i+1}>1:(n-1)^2\)
  • \(a_i>1,a_{i+1}=1:\) 这时候会有一连串 \(1\),不妨枚举 \(a_i\) 填什么,会得到 \(f_{i+a_i+1}\) 的贡献,当 \(i+a_i+1>n\) 时贡献变成 \(1\),也就是 \(i+1+\sum_{j=i+3}^nf_{j}\)

维护后缀和转移即可。

ARC 073

E

注意到在染色求不同色最大最小编号时,全局的最大最小值必然会占用其中某个最值的位置

颜色具有对称性,所以我们可以钦定编号最小的球取红色。

  • 编号最大的球也是红色

    考虑这时候已经固定了 \(R_{\max}-R_{\min}\),最小化 \(B_{\max},B_{\min}\)

    不妨钦定题目所给 \(x_i\le y_i\) 且 按照 \(x\) 排序。

    则至少有 \(B_{\max}\ge x_n\)

    考虑到这时候,我们将球扔给红色就没有任何影响了,所以所有的球其实可以分成两半,也相当于是要求所有的球至少有一个在 \([B_{\min},B_{\max}]\) 里面

    离散化后枚举 \(B_{\min}\),相当于是要求:

    • 不存在 \(y_i<B_{\min}\)
    • \(x_i\le B_{\min}<y_i\)\(y_i\)
    • \(x_i\ge B_{\min}\),取 \(x_i\)

    容易发现这是有单调性的,可以维护 \(B_{\max}\)

    (还有一个方法是依次反转颜色)

  • 编号最大的球是蓝色

    可以局部贪心

    将一组球里编号小的染红,大的染蓝,显然最优。

F

显然你操作后至少有一个位置在 \(x_i\),不妨设 \(f_{i,j}\) 为当前球的位置为 \(x_i,j\) 的最小时间代价。

等效而言,每次至多移动一个球

那么会有移动 \(x_i\) 和移动 \(j\) 的区别,有:

  • 移动 \(x_i\) 去满足要求,\(f_{i+1,j}\leftarrow f_{i,j}+|x_i-x_{i+1}|\)
  • 移动 \(j\) 去满足要求,\(f_{i+1,x_i}\leftarrow f_{i,j}+|j-x_{i+1}|\)

绝对值拆开后可以线段树优化。

ARC 074

E

其实很明显了,因为只有三个颜色,结合数据范围容易想到直接 \(f_{i,j,k}\) 表示填了 \([1,i]\),三种颜色的最后出现位置,默认 \(i>j>k\),如果没出现就是零。

转移即可。\(O(n^3+n^2m)\)

F

明摆着最小割嘛

建立行列虚点进行连边,跑最大流即可

ARC076

F

线段树维护霍尔定理即可

ARC078

F

怎么说呢,考虑最终的图需要满足什么性质

无向图,\(1\to n\),只有一条唯一的路径

状压,枚举子集转移就好了。

ARC079

F

考虑到树的部分的叶子节点必然是 \(0\)

反着倒推可以发现这个解必然需要 \(a_u\le mex(\lbrace a_{v}|v\in Son(u)\rbrace )\)

并且要求一条边的不能相同,所以 \(a_u=mex(\lbrace a_{v}|v\in Son(u)\rbrace )\)

那么我们考虑构造完树之后上环

考虑一些简化情况

对于独立偶环可以0/1交替分布

独立奇环显然无解

一个 \(naive\) 的想法是枚举一个起点,然后从它开始往后推更新 \(mex\)

找到这样一个点:满足 \(a[nxt[i]]>a[i]\) 或者 \(<a[i]-1\),这样它无论如何变化都影响不到当前点,这样往前扫更新判断合法即可(好像一定合法?)
如果不行,那么我们可以知道对于每个 \(i\)\(a[nxt[i]]\in [a[i]-1,a[i]]\),则差分下来不是 \(0\) 就是 \(1\),但这是一个环,差分数组值和为零,所以我们可以推知所有值相同

那么无解当且仅当环上所有值相同且是奇环

ARC081

F

先找一些性质:

  1. 行列交换不影响答案
  2. 全白与全黑等价
  3. 如果钦定一个矩形全黑,那么我首先看其左上角 (x,y),将这一行/列颜色不同的直接反转对应列/行,此刻该矩形不能进行任何操作
  4. 任意子矩形满足此性质

由性质3可以推得其四个角异或和是0——任意子矩形四个角异或和为0

这很强啊,说明整个矩形的值直接被第一行第一列决定了

而且这显然充分。而又由于这是性质所以这是必要的,所以这是充要的

首先答案是max(n,m),然后就必然行列有一个 \(\ge 2\),就可以只判断 \(2\times 2\) 的矩形了。

那么将合法的 \(2\times 2\) 矩形左上角标记为 \(1\) 其余为零,就变成最大全 \(1\) 子矩形了,单调栈处理即可。

ARC 082

F

注意到这样的操作不会增大两个初始值不同的数字的差距,所以不妨将所有有关的 \(a\) 离散化后建立线段树,每次操作相当于 \(x\leftarrow \max(0,x-d)\) 或者 \(x\leftarrow \min(X,x+d)\),其实在线段树上就是一段区间修改加另外的地方区间覆盖,暴力维护即可。

ARC 083

F

首先如何降维?

不妨连边 \((x, y+n)\),我们要做的就是求 \(2n\)​ 的排列,满足什么?

可以发现由于每个机器人都会删去一个点,所以每条边与每个点是有一个匹配关系的,不妨设 \((u,v)\) 里,边匹配 \(u\),那么将方向设置为 \(u\to v\),这就等价于要求每个点的出度是 \(1\) 了,所以这样连出来的图必须是基环树森林。

那么显然我们只需要考虑一颗基环树。

通过基环树,我们通过枚举环的转动方向,可以得到每个点是被哪个机器人删掉的。

那么我们只需要在此基础上,根据已知信息,想办法确定这个偏序关系且求出拓扑序即可。

什么是有偏序关系的呢?

譬如行,我知道这一行回收的是第 \(y\) 列的那个球,那么同一行在 \(y\) 列前面的那些列的点一定需要先于这个机器人进行操作。

列是同理的,那么我们还是可以建立出一张偏序关系图,且这个图应当是一棵树(你相当于是保留了基环树的部分边)。

所以求树的拓扑序即可,这是容易的,答案就是 \(\frac{|V|!}{\prod sz_i}\)

对于每一颗基环树如此处理,最后乘算即可

ARC084

F

考虑求出线性基,这样我们可以通过类似数位DP的方式得到总方案数。

显然每个数字至多右移 \(|S|\) 次,所以暴力插入线性基是 \(O(n|S|^3)\) 的。

考虑优化, \(S\)\(2S\) 有什么区别呢?

首先所有串的总成功插入只有 \(O(|S|)\) 次,所以我们考虑 \(S\) 插入后留下的串为 \(H\),那么插入 \(2S\)\(2H\) 是等价的。

因为在除开最高位不谈的情况下,\(S\oplus H\) 是可以被线性基表出的,如果不顶到最高位,那么 \((2S)\oplus (2H)\) 也是可以被表出的(因为线性基显然满足可以表出 \(2X\),就可以表出 \(X\)

所以我们只用 \(H\) 进行移动然后反复操作,最后每次操作必然会发生如下事情:

  1. \(H\) 右移
  2. \(H\) 某个二进制位消失或者某个线性基位被填充。

总的来说事件 \(2\) 所有串加起来最多发生 \(O(n|S|)\) 次,所以线性基的总复杂度是 \(O(\frac{n|S|^2}{w})\) 插入的(不可能有人不知道用 bitset 吧。。。)

然后我们考虑计算答案,可以像数位DP一样从高位到低位进行决策(其实很像Trie。)

维护一个串 \(now\) 表示当前串(一直尽力顶上界),然后 \(base_i\) 表示线性基上的串,\(M\) 表示限制串。

依次往下扫描,设当前到了第 \(i\) 位。

  • \(base_i\) 不存在

    • \(M_i=0\)

      \(now_i=1\),则后续无望,否则 continue;

    • \(M_i=1\)

      \(now_i=0\),则后面怎么填都行,只需要看 \(i\) 位以下还有几个 \(base\) 能异或即可。

      否则 continue

  • \(base_i\) 存在,此时我们考虑是否异或它。

    • \(M_i=0\)
      • \(now_i=1\),我们需要异或上 \(base_i\) 消去上界限制
      • \(now_i=0\),我们不需要异或它,异或了就非法了
    • \(M_i=1\)
      • \(now_i=1\),我们异或了 \(base_i\) 之后下面的就可以随便异或了,这里算上方案数,然后不异或 \(base_i\) 继续决策
      • \(now_i=0\),此时我们不异或 \(base_i\) 下面就可以随便异或了,算上方案数然后异或 \(base_i\) 继续决策。

最终如果发现可以表出 \(M\),那么答案还得加一。

另一个做法是将其当成系数对 \(2\) 取模的多项式 \(A_i(x)\) 进行处理,那么就对应多项式的 加法和移位的操作,求出多项式的 gcd们,也就是设 \(P(x)=\gcd(A_1(x),A_2(x)…,A_n(x))\)

具体求法,可以像辗转相除法一样,每次看最高位更低的是谁,通过位移和异或让另一个的最高位降低比当前这个数的最高位更低。最后得到零后取另一个

那么只需要看有多少个 \(G(x)\) 满足:

  • 二进制下 \(G(x)\times P(x)\) 不超过 \(M\)

可以发现由于最高位由 \(G(x),P(x)\) 的最高位决定,那么设 \(M\) 最高位是 \(b\)\(P\) 最高位是 \(a\),那么 \(G(x)\times P(x)\)\([a,b]\) 位都是任意的,也就是说 \(G(x)\) 最高位为 \(b-a\)(从零开始)(根据 \(G(x)\times P(x)\)\([a,b]\) 位可以唯一确定 \(G(x)\)

那么我们取出 \(M\)\([a,b]\) 位组成的二进制数,只要 \(G(x)\) 严格小于这个数那么一定合法,当 \(G(x)\) 等于这个数的时候可能不合法(特判),\(G(x)\) 大于这个数时一定不合法

方案数也就呼之欲出了。

ARC085

F

首先答案可以写为:

\[\sum (0,1)+\sum (1,0)=\sum (0,1)+\sum (0/1,0)-\sum (0,0) \]

\(\sum (0/1,0)\) 可以直接根据 \(b\) 得出,那么我们只需要让 \(\sum (0,1)-\sum (0,0)\) 最小即可。

不妨令 \(a_i=[b_i=1]-[b_i=0]\),那么每次修改相当于是选择一个区间全部改为 \(0\),然后我们要使最终区间和最小。

考虑 \(dp\)

将所有操作区间安装右端点排序,设 \(f_i\) 为决策了前 \(i\)​ 个区间的最小值。

对区间操作进行 dp,往往考虑排序这些区间,然后设决策前 \(i\) 区间为状态

那么 \(f_i\) 的转移包括枚举无交区间,以及有交(不能是覆盖)区间。

  • \(r_j<l_i\),可以从 \(f_j+\sum_{k=r_j+1}^{l_i-1}a_k\) 转移
  • \(l_j\le l_i\le r_j\),可以从 \(f_j\)​ 转移

转移过程中存在几个维度的偏序不太好优化。

可以考虑以 \(l_i\) 为单位进行 dp

对于每个 \(l\),开一个 vector 存下所有相关的 \(r\),同时设 \(f_{i,j}\) 为操作完 \(l\le i\) 的区间后,\([1,j]\) 的权值和最小值。

那么显然有操作:\(f_{l,l}=\min(f_{l,l},f_{l-1,l-1}+a_l)\),与此同时枚举操作 \([l,r]\),可以用 \(f_{l,l-1\sim r}\) 来更新 \(f_{l,r}\)(这里应按照 \(r\) 从小到大排序)

这一步是可以使用线段树维护的。

这一步 利用线段树是查询区间,巧妙地通过排序 \(l\) 和区间查询优化了这个复杂的转移关系(查询区间可以解决两个偏序)

那么 \(f_{l,r}\)\(f_{l+1,r}\) 就不需要拷贝了,公用一个数组。

	for(int i=1;i<=q;++i){
        int l,r;cin>>l>>r;
        op[l].push_back(r);
    }
    for(int i=1;i<=n;++i){
        sort(op[i].begin(),op[i].end());
        for(int r:op[i]){
            int w=min(f[i-1],find(1,1,n,max(1,i-1),r));
            if(f[r]>w){
                f[r]=w;upd(1,1,n,r,w);
            }
        }
        f[i]=min(f[i],f[i-1]+b[i]);
    }

ARC086

F

首先若有 \(a\le b\),则经过无数轮操作之后仍然有 \(a\le b\),所以不妨给序列 \(A\) 先排序

注意到 221 等价于 12,这告诉我们操作序列形如:

\((2)1(2)1(2)1\dots (2)1(222\dots )\)

所以我们考虑枚举进行的 \(1\) 操作个数 \(t\),和每次操作所进行 \(2\) 操作次数 \(a_i\),显然有 \(a_i\le 1\) ,且在进行 \(i\) 次操作 \(1\) 进行操作 \(2\) 等效于最初减去 \(2^i\)(下取整可以拿出整除的部分)

所以这相当于在最开始减去 \(w=\sum a_i2^{i-1}\)

这是一个二进制数。

同时我们考虑 \(\lfloor\frac{A}{2^t}\rfloor\)\(\lfloor\frac{A-w}{2^t}\rfloor\) 如果有差异,那么必须有 \(A_i\bmod 2^t<w\),显然 \(w<2^t\)

所以我们枚举 \(t\) 之后,作用不同的 \(w\) 仅有 \(O(n)\) 个(将 \(A_i\bmod 2^t\) 存下排序后的每一段)。

此时我们只需要贪心地考虑作用相同的一段区间 \([l,r]\) 里取出 popcount 最小的 \(w\) 即可,这样可以给我们余下最多的操作次数。

取法:

首先我们将 \(l\) 减去 \(1\),变成求 \(>l\) 的数字

首先我们求出 \(l,r\) 二进制下 \(lcp\) 的后一个位置,那么 \(w\)\(l,r\) \(lcp\) 的这些二进制位是一样的,同时这个失配位置显然 \(l\) 是零 \(r\)\(1\),我们将其改为 \(1\) 即可。

容易证明这一定是最小的。

然后我们便可以再 \(O(n)\) 地处理出变化后的序列 \(C,C_i=\lfloor\frac{A_i-w}{2^t}\rfloor\)

接下来我们还剩下 \(cnt=K-t-popcount(w)\) 次操作次数。

注意到全局减一等价于差分数组首项进行更改,所以不妨做差分数组,删去首项后的数组作为一个状态(\(O(n\log V)\) 个),我们只需要求出所有状态的首项取法之和即可。

在这里,我们的首项可以取 \([\max(0,C_0-cnt),C_0]\),将这个区间存下来。

最后,我们遍历所有状态的所有区间,求出它们包含数字的总数加入答案。

实现精细可以做到 \(O(n^2\log V)\)

ARC087

F

考虑每条边显然有上界 \(2\min(sz_u,n-sz_u)\) 次,而这个可以明显构造

所以问题转变为计数

拉出重心,直接变成 \(sz_u\)

所以这限制等价于?等价于 \(u,p_u\) 不在重心的同一方向

注意到 \(n=5000\),考虑进行容斥,设 \(f_i\) 为钦定 \(i\) 个点非法的方案数,可以二项式反演出答案。

我们只需要考虑重心的各个儿子 \(v_1\sim v_m\),从儿子 \(v_i\) 里选出 \(j\) 个点对内部自己匹配的方案数是 \({sz_{v_i}\choose j}^2j!\),所以 \(f'_j=\sum f_{j-k}·{sz_{v_i}\choose k}^2k!\)

这是一个卷积,暴力可以做到 \(O(n^2)\)

当然可以根据大小分治每一层做 \(NTT\)\(O(n\log^2 n)\)

ARC 088

F

很板啊,考虑叶子节点貌似一定是链的端点

更一般地,度数是奇数的点一定是链的端点,如果合并链的端点,那么其实相当于拼成一条链,这是不必要的

那么 \(A=\frac{\sum [deg_i\equiv 0\pmod 2]}{2}\)

考虑求解 \(B\),其实是给这些点两两配对,让最远边最小

二分答案,如何判断?

\(f_i\) 为在子树由合法的链组成的条件下,点 \(i\) 原本所在链的最小长度。

那么对于 \(f_i\) 而言,拿出所有的 \(v\in Son(i),f_v+1\) 作为接在 \(i\) 上面的所有链。

假设有 \(h\) 条,如果 \(h\) 是偶数,那么我们加入一个长度为 \(1\) 的链(这个点是奇度点(非根),自身是端点)

然后我们需要从这奇数条链里选择一条往上传,并且剩下的链存在两两配对方案使得配对后长度不超过 \(B\)

排序后,显然是大的配小的,二分往上传的是哪条链,判断其他链是否合法。

\(O(n\log^2 n)\)

注意到可能上传上来的链自身就不合法,注意二分边界问题。

ARC089

E

考虑到最终答案与 \(x,y\) 有关,那显然所有路径仅与三个量有关:

  • 所经 \(x\) 个数,所经 \(y\) 个数,所经定边长度。

不妨设 \(f_{i,j}\) 为经过 \(i\)\(x\)\(j\)\(y\) 确定边最短的路径长度。

显然有 \(d_{x,y}=\min(f_{i,j}+ix+jy)\)

显然可以取出一组解 \(f_{i,j}\ge \max(d_{x,y}-ix-jy)\)

并且 \(f_{i,j}\) 越大越容易使得 \(d_{x,y}\) 的条件无法满足,所以我们取 \(f_{i,j}=\max(d_{x,y}-ix-jy)\)

然后回过来判一下 \(d_{x,y}\) 的合法性,存在非法即为无解。

否则我们考虑构造。

这是简单的,我们由 \(S\to T\) 连接两条链,一条全是 \(X\),一条全是 \(Y\),然后在 \(S\) 出发第 \(i\)\(X\)\(T\) 出发第 \(j\) 个 $Y $ 连边 \(f_{i,j}\) 即可。

F

考虑一个最终序列的一种唯一生成方式

由于不可以直接用蓝色染白色,所以我们会贪心地将最终的极长有颜色连续段着色为红色,然后就跳过红色,用蓝色着色。

最终极长有颜色连续段不超过 r 个数

然后我们可以顺次扫,扫到 r 就覆盖一个极长有颜色连续段(如果还能的话)

扫到 b

我们有两种决策,就是用 br 得到两个蓝色连续段(或者说我们可以用 b\(x\)r 得到 \(x+1\) 个蓝色连续段)

那么我们不妨考虑一个极长颜色连续段被生成的条件。显然我们先整体染红。

综述有:

  • 需要一次 r 整体染色
  • 最左最右的 r 段是不重要的,可以删去
  • 然后会得到 BRBRBRBRB的串
  • 需要最少一个 b,然后后面任意取色都可以

所以就是需要 \(1+cnt_B\) 次操作,需要一个 r 和一个 b\(cnt_{B}>0\)) 作为开头操作,其余任意。

也就是我们可以用一个子序列 rb 往后接任意个数就可以变换出 (R)BRBR...RB(R) 的串,长度任意,这里是个组合数了已经。

枚举红蓝段个数 \(x\) 以及全红段个数 \(y\),可以把所需 rbr 直接处理出来(尽可能往前取)

优先满足红蓝段再满足全红段。

rb 按照 b 位置进行排序,设为 \(b_1\sim b_x\),然后将 r 按照 r 位置排序设为 \(c_1\sim c_y\),设 \([i,n]\) 的自由操作有 \(s_i\) 个,设每个段最终会有 \(cnt_i\) 个蓝色段。

则一个序列合法当且仅当:

\[\forall i\in [1,x]\cap Z,s_{b_i}\ge \sum_{j\ge i}(cnt_j-1) \]

考虑倒序 \(dp\)\(cnt\) 内部顺序需要在意吗?需要的,我们肯定先放满 \(cnt\) 较大部分的,但是各个段直接不区分顺序,则

\(f_{i,j,k}\) 为已经确定了 \(cnt_i\sim cnt_x\)\(\sum_{t\ge i}cnt_t-1=j\)\(cnt_i=k\)

组合数是最终 \(cnt\) 段的相对位置关系。

\[f_{i,j,k}=\sum_{t=i+1}^x\sum_{h=1}^{k-1}f_{t,j-(t-i)·(k-1),h}{x-i+1\choose t-i} \]

最后的贡献 \(f_{1,j,k}\)

前缀和计算是 \(O(n^3\log n)\) 一次 dp。

这怎么看,其实相当于\(\sum (2cnt_i-1)\) 个必须填的个数,也就是 \(2j+x\),以及 \(2x\) 段可填可不填的,还有 \(y\) 个必填的,并且还会有 \(x+y-1\) 个空必须放,两侧还有 \(2\) 个空。

也就是必填的有 \(2j+x+y+x+y-1=2(j+x+y)-1\),有 \(2x+2\) 可空。

设前面是 \(X\),后面是 \(Y\),先强制给空的放一个进去变成 \(n+Y\),然后就放 \(X+Y\) 个,则方案数显然是:

\[{x+y\choose x}{n+Y-1\choose X+Y-1} \]

完了。

果然恐怖如斯

ARC 089

F

首先当 \(f\) 比较大的时候就不会出现跨两段的情况了。

所以可以分类讨论:

  • \(f(l)\le 7\),这样的 \(r\) 最多只需要枚举到 \(2.25e7\),所以可以暴力
  • \(f(l)\ge 8\),此时不可能出现跨两段,也即 \(f(r)-f(l)\le 1\)

考虑解决:

  • \(8\le f(l)<f(r)\)

    \(f(l)\) 用了 \(x>0\) 个,\(f(r)\) 用了 \(y\) 个,有:

    \(x·f(l)+y·f(r)=K=(x+y)f(l)+y\)

    因为 \(x+y>y\),因此 \(y=K\bmod (x+y),f(l)=\lfloor\frac{K}{x+y}\rfloor\)

    注意这里 \(y=0\) 会算重,后面会说。

    由此我们知道 \(x+y\) 可以唯一确定 \(y\)\(f(l)\),也就是一个 \(x+y\) 唯一对应一个方案。

    考虑可能的 \(x+y\) 有哪些。显然只需要 \(8(x+y)\le K\) 即可,也就是 \(x+y\) 共有 \(\lfloor\frac{K}{8}\rfloor\) 种取法。

  • \(8\le f(l)=f(r)\)

    此时我们考虑设 \(t=f(l)=f(r)\),那么值为 \(t\)\(f\) 一共有 \(cnt=10^t-10^{t-1}\) 个。

    • 必须有 \(t|K\)
    • \(r-l+1=\frac{K}{t}\)

    所以有 \(cnt-\frac{K}{t}+1\) 个。

    但是在上面那个情况里 \(y=0\) 的情况我们算到了上面,这导致里会算重一个,因此我们实际加入的应当是 \(cnt-\frac{K}{t}\)

ARC104

D

考虑枚举 \(x\),那么相当于用 \(-(x-1)\sim n-x\) 各不超过 \(k\) 个凑出 \(0\) 的方案数,也等于用 $1\sim x-1 $ 和 \(1\sim n-x\) 凑出同样和的方案数乘上 \(k\),那么设 \(f_{i,j}\)\(1\sim i\) 和为 \(j\) 的方案数,这一步用前缀和可以优化到 \(O(n^2k^2)\),同时 \(x\) 的答案就是 \(\sum f_{x-1,i}·f_{n-x,i}\)

E

考虑 \(n\) 很小,于是我们爆搜出所有可能的相对关系(\(O(n^n)\) 爆搜每个数 \(1\sim n\) 然后离散化,事实上只有四千余个)

问题转化为对于每个可能的相对关系求出它的 LIS 长度以及达到它的方案数。

LIS 长度可以简单DP求出,问题在于第二个部分。

我们求出每个相对值 \(i\) 的真实取值范围 \([1,up_i]\),注意必须有 \(up_i\ge i\)

按照每个相对值 \(1\sim m\) 的顺序把数放进去,考虑借鉴划艇那个题目的方法,我们分段处理,注意每个 \(up_i\) 将值域划分为了 \(m\)\([up_{i-1}+1,up_i]\),我们可以枚举哪一段区间对应哪一段值。

也就是设 \(f_{i,j}\)\(i\) 的值在第 \(j\) 段且它是最后一个在第 \(j\) 段的数的方案数

\(f_{i,j}=\sum_{p<j,k<i}f_{k,p}·{up_j-up_{j-1}\choose i-k}\)

前缀和优化即可做到 \(O(n^3)\)

所以总复杂度 \(O(n^{n+3})\)

F

这就是纯发现性质题了。

一个显然的地方是 \(h_i\leftarrow \min(h_i,n)\)

容易发现这是单调栈元素,可惜这并无什么用。

关键点是 关注最后一个 \(-1\) 的出现,它是全局的最大值(相同靠后更大),在它之后的元素是一个子问题

关注不同角度发现子问题

有根据 \(n\le 100\),我们完全可以枚举这个位置,设 \(f_{l,r,v}\) 表示区间 \([l,r]\) 所有数字不大于 \(v\) 时的方案数。

边界:\(l>r\)\(1\)\(v<1\)\(l\le r\) 为零。

转移很简单,是 \(f_{l,r,v}=\sum_{k\in [l,r]}f_{l,k-1,\min(h_k,v)}·f_{k+1,r,\min(h_k,v)-1}\)

复杂度 \(O(n^4)\)

ARC 105

D

考虑最终是 Nim 集合

\(n\) 是奇数的时候最终轮到后手操作,他必胜,它可以每次拿尽可能大的然后堆在一起然后就赢了(堆在先手放的那一堆里面),
可以说明的是他至少可以拿出最大值,而这一堆必然大于剩下的所有堆的和。根据 \(a \oplus b \le a+b\) 一定可行。(主要是有奇数个背包)
\(n\) 是偶数的时候先手在拿一个之后就变成后手可以模拟它操作,那么除非它的模拟是徒劳无功的,否则就必胜。
徒劳无功当且仅当后手可以给先手撤掉
那就是每个数都出现偶数次后手就必胜了

E

考虑终态,一定是有且只有两个连通块,且都连成了完全图。

假设与 \(1\) 连了 \(x\) 个点,那么总操作次数就是:

\(\frac{x(x-1)}{2}-\frac{(n-x)(n-x-1)}{2}-m=\frac{n(n-1)}{2}-m-x(n-x)\)

与这个玩意奇偶性有关,注意到 \(n\) 是奇数则后面永远是偶数,这时候胜负已判。

\(n\) 是偶数的话那我们就判断 \(x\) 的可达集合的奇偶性了。

然后考虑最开始的两个连通块大小 \(a,b\)

如果 \(a,b\) 奇偶性相同,则剩余偶数个元素,那么奇数连通块是偶数个。

我们只关注 \(ab\) 的奇偶性,这与答案有关。那么优势方一定有办法让自身保持优势(选一个偶数加,如果没有偶数那么应当还能连其它连通块内边做无效操作,否则可以将两个奇数连通块合并为一个偶数连通块,总之就是有事情做),劣势方一定没办法转化(你必须要加入一个奇数,且对应的乘的数是奇数,这时候我再给你加一个奇数就还是回到局面)

如果 \(a,b\) 奇偶性不同,那么一定有奇数连通块,则先手可以任意改变 \(a,b\) 的奇偶性然后变成后手保证奇偶性不变,所以此刻先手必胜。

那就完了。

DE:关注奇偶性,极端值以及极端情况发现性质

F

显然是容斥题。

\(f_S\) 为将集合 \(S\) 划分为两部分的方案数(两个部分不区分,可以没有),也就是枚举子集(可以是 \(S\) 和空集) \(T\) ,然后 \(T,S\) 自己内部的边没有,两者之间的边任意,这是二的幂,我们枚举 \(S\)最小元素在左边

然后考虑变成连通的二分图,那么我们只需要枚举子集容斥。

\(g_S\) 为将 \(S\) 划分为二分图并且左右部连通的方案数,有:

\(g_S=\sum_{T\subset S}2g_Tf_{S/T}\)

这里我们要求 \(S\) 里面最小的元素在 \(S/T\)

我们枚举 \(f\) 里面的两个部分加入到 \(g\) 的哪一边。

它的正确性?容易发现每一个被分为 \(k\) 个连通块(每个连通块都是二分图)的方案在 \(f\) 里被算 \(2^{k}\) 次,在 \(g\) 里面那个乘以二的系数解决了它(强制不连通,分出一个单独的连通块),最终只有整体连通的方案没有被删掉。

钦定某个特征元素为不动点进行容斥避免算重

ARC 106

D

显然对于 \(x\) 的答案有:

\[\begin{aligned} ans(x)&=\sum_{1\le l<r\le n}(a_l+a_r)^x\\ &=\sum_{1\le l<r\le n}\sum_{i=0}^x{x\choose i}a_l^ia_r^{x-i}\\ &=\frac{1}{2}\sum_{i=0}^x{x\choose i}\left(\left(\sum_{j=1}^n a_j^i\right)\times \left(\sum_{j=1}^n a_j^{x-i}\right)-\sum_{j=1}^n a_j^x\right) \end{aligned} \]

每个元素的次幂和可以 \(O(nk)\) 预处理,\(ans(x)\) 可以在 \(O(x)\) 预处理,所以复杂度 \(O(nk+k^2)\)

E

看到 \(n\le 18\),考虑集合枚举。

容易想到二分答案,在这之后就是一个带权的霍尔定理,那么我们可以枚举 \(S\),问题在于求出 \(N(S)\)

容易发现答案不超过 \(2nk\),所以对 \(2nk\) 天每天求出一个 \(s_i\) 表示所有第 \(i\) 天可以颁奖的人的集合,则 \(U/s_i\) 的所有子集就没有这一天。\(O(n^2k)\)

对这个做个高维后缀和,可以求得 \(all-N(S)\),所以 \(N(S)\) 就知道了(也就是求出所有非法天后就知道 \(N(S)\) 了)。

再判断一下即可,复杂度 \(O(n^2k+n2^n(\log n+\log k))\)

F

根据 Prufer 序列,答案是

\[\begin{aligned} Ans&=\sum_{\sum d=2n-2}{n-2\choose d_1-1,d_2-1\dots d_n-1}\prod_{i=1}^n{a_i\choose d_i}d_i!\\ &=\sum_{\sum d=2n-2}(n-2)!\prod_{i=1}^n{a_i\choose d_i}d_i\\ &=(n-2)!\sum_{\sum d=2n-2}\prod_{{i=1}}^n{a_i-1\choose d_i-1}\frac{a_id_i}{d_i}\\ &=(n-2)!\left(\prod_{i=1}^ma_i\right)\sum_{\sum d=n-2}\prod_{i=1}^n{a_i-1\choose d_i}\\ &=(n-2)!\left(\prod_{i=1}^ma_i\right)[x^{n-2}]\left(\prod(1+x)^{a_i-1}\right)\\ &=(n-2)!\left(\prod_{i=1}^ma_i\right)[x^{n-2}](1+x)^{\sum a_i-n}\\ &=(n-2)!\left(\prod_{i=1}^ma_i\right){\sum a_i-n\choose n-2}\\ \end{aligned} \]

ARC107

D

显然背包题,注意是可重集。

\(f_{i,j}\)\(N=i,K=j\) 的答案,如果选的数是 \(2\)任意整数次幂,那么显然有 \(f_{i,j}=f_{i,2j}\)

但是可惜不是。

不过我们仍然可以考虑枚举当前决策,假设我们降序填数,如果当前数字填了 \(1\),可以从 \(f_{i-1,j-1}\) 拿到,如果填了 \(\frac{1}{2}\),那么可以从 \(f_{i-1,2j-1}\) 拿到,因为所有除以 \(2\) 之后就是解,而且保证了填的数不会大于 \(\frac{1}{2}\)

所以其实是由 \(f_{i-1,j-1},f_{i-1,2j-1},f_{i-1,4j-1}……\) 转移而来,不过后面的 \(2j-1,4j-1\) 可以交给 \(f_{i,2j}\) 解决。

E

打表题,发现没有几次之后对角线元素就不变了,所以考虑暴力操作最外面 \(10\) 层计算答案。

F

\(N=300\),发现连通性很难处理,缩点也没什么性质,所以考虑网络流。

假定所有数字都产生正贡献 \(|B_i|\),我们来看看损耗

如果一个点被删掉,其损耗是 \(A+|B|\),如果一个点被划到与其权值正负不同的连通块里损耗是 \(2|B|\)

那么考虑类比最大权闭合子图建图,拆为入点和出点,将其链接容量 \(A+|B|\) 的边,表示割断代价。

原图边保留双向,变为 \(inf\)

原点向正点入点连接边,边权 \(2|B|\),负点出点向汇点连边,边权 \(2|B|\)

跑最小割即可。

最后的残量网络连通块也就是方案。

\(s\) 最终连通的点为正点,与 \(t\) 最终连通的为负点。

ARC 108

D

分讨题。

首先考虑由于只有 AB,所以考虑 AB 是 A 的时候,如果 AA 是 A 则原序列只能是 AAAA……AAAB,否则再考虑 BA 是什么,如果 BA 是 A,那么合法序列不出现BB,可以直接DP,否则任意序列显然可以通过回缩变回AB。

AB是B同理分析。

E

分步计算贡献,考虑最强的限制,当一个点被最强的限制限制后,就不需要考虑其他限制了。

所以当 \(l,r\) 被选择之后,\([l+1,r-1]\) 内部的点的选择就与外部点无关了。

那么设 \(f_{l,r}\) 为除掉区间端点后区间期望选择点个数,设 \(c_{l,r}\)\([l+1,r-1]\) 内满足 \(a_l,a_r\) 偏序关系的点的个数,则有:

\[f_{l,r}=\frac{1}{c_{l,r}}(\sum_{a_l<a_x<a_r} f_{l,x}+f_{x,r}+1) \]

F

无论将树内的点划分为多少个集合,同集合内部点两两之间的距离最大值都是这集合点构成的虚树的直径长度

而考虑这个划分本质上是将树划分为两个集合,求每个集合点两两之间距离最大值的最大值。

原本树的直径的两个端点至少有一个作为答案的贡献点

那么显然如果直径端点同色就取直径端点,下面默认直径端点异色

\(ds_{i},dt_{i}\) 为点 \(i\) 距离两个直径端点的距离,则每次染色相当于是对于每个 \(i\)\(ds,dt\) 里选一个。

\(mn=\max(\min(ds_i,dt_i))\),显然答案只能够 \(\ge mn\)

我们考虑容斥,对于每个 \(k\)(从零开始) 计算答案 \(>k\) 的方案数。

其实很简单,就是当 \(k\le mn\) 时,总方案 \(2^{n}\),否则总方案是 \(2^{n}-2^{c}\),其中 \(c\)\(\max(ds_i,dt_i)\le k\) 的点的个数(它随便取,对于其他的点就只能取较小的那个元素了)。

ARC 184

A

考虑 \(19\) 个分组,用每组第一个与所有的询问得到 \(0,1\) 的点的个数。(最后 \(12\) 个先留着)。

若某一组较少的点的个数少于 \(9\) 则一定是非法的。

否则假设有这么一组,且还有其他组出现可以判定的非法则取 \(9\) 的一组。

否则考虑与最后一组进行判断。

如果此刻一个非法的都没找到则最后一组可以直接找到。

否则我们可以求出最后一组非法元素个数,输出即可。

唯一需要注意的是若最后一组非法 \(6\) 个,则找一个前面的一定合法的来问即可。

总询问次数 \(949\) 次可以通过。

B

显然将所有数 \(N\) 拆为 \(x2^a3^b\),按照 \(x\) 分组,每组互相独立。

然后这个问题就变成了网格问题,相当于我们需要点亮一部分点,对于存在数的点 \((a,b)\)\((a-1,b),(a,b-1),(a-1,b-1),(a,b)\) 自身至少有一个被点亮。

并且这个网格取决于 \(\lfloor\frac{N}{x}\rfloor\) 的大小。这里就可以数论分块每一类答案了(可以通过 \(n-(n/2)-(n/3)+(n/6)\) 算出所有不是 \(2,3\) 倍数的数字)。

我们先处理出网格的边界,然后考虑一个轮廓线DP,显然为了减少状态,状压 \(3\) 的幂,也就是行。

定义 \(dp_{i,j,S}\) 为前 \(i\) 行,\([0,j-1]\) 已经填好,\([j,m]\) 是目前已经可以确定是否可以不填的状态。

转移讨论一下即可。

注意一个细节是我们需要考虑上一行的末尾到这里会变成零(上一行至多比当前多一个位置)所以我们可以增加这一行的长度来将这个最后一位转化下来。

D

显然按照 \(x\) 桶排后变成一个排列。

然后发现最终局面只与被操作的点有关,与操作顺序无关。

所以可以设计一个 DP,设 \(f_i\)\([1,i]\) 中进行操作,且 \(i\) 是最后一个被操作的点的可能局面数。我们可以钦定 \(a_{n+1}=0\) 来计算前面的方案数总和。

考虑不重不漏的计算,我们可以钦定这个操作序列扩展到不能再次扩展除非会影响局面即可。

那么也就是操作任意一个未操作点都会引起局面变化,那么 \(f_i=\sum f_j\),在满足 \([j+1,i-1]\) 之间的点任意操作一个都会导致局面变化,那么我们扔掉被删的点后,每个点都必须要么前面有数字小于他要么后面有数字大于他,\(O(n)\) 判断即可。

\(O(n^3)\)

ARC 185

A

最后打完的肯定是Bob,而他打完就输了

如果他能赢,那必须是逼着Alice打出一张牌然后输掉

当Alice有更多选择的时候这样一定是无效的,同理交换先后手的话 \(Bob\) 有更多的牌也是无效的。

所以我们只能够在Alice只有一张牌的时候决胜,此时Bob还有一张牌

那么这时候 \(n*(n+1)-k\)\(m\) 的倍数

判断是否存在这个 \(k\in [1,n]\) 即可。这个 \(k\) 可以解出来,判断范围即可。

\(O(1)\)

B

不妨把差分数组还原,也就是 \(b_i=\sum_{j\le i} a_j\),也就是有不动点 \((0,0)\)\((n,b_n)\),你可以将任意 \(b_i,i\in [1,n-1]\) 加上任意值,要求最终是凸的。

考虑调整法,维护目前最小斜率 \(k\),若 \(a_i\le a_{i-1}+k\),则将 \(a_i\) 改为 \(a_{i-1}+k\),否则考虑取平均斜率,也就是拟合直线 \((0,0)\to (i,a_i)\),这时候 \(k\) 被更新为 \(\lceil\frac{a_i}{i}\rceil\)

最后判断 \(a_{n-1},a_n\) 是否合法即可。

\(O(n)\)

C

zz 题。

首先整体做一次FFT,可以知道两个数的可凑出数集合(将重复选一个数的去掉)。

枚举从后往前 \(k\),我们只需要知道 \(X-A_k\) 能否在 \(A_k\) 不参与的情况下由两个数凑出来。这显然是可以 \(O(1)\) 的。

然后我们知道了 \(A_k\),就可以枚举 \(A_j\) 判断 \(A_i\) 的存在了。

\(O(n\log n)\)

D

考虑 \(M=1\) 的情况,此时相当于有一个 \(0\) 点下面接了点 \(1\sim n\)

显然设 \(f_i\) 为当前还有 \(i\) 个点未标记且在 \(0\) 的标完的期望次数,显然有:

\(f_i=2+\frac{i}{n}f_{i-1}+\frac{n-i}{n}f_i\implies f_i=\frac{2n}{i}+f_{i-1},f_0=0\)

然后答案是 \(f_n-1\),所以答案是 \(\sum_{i=1}^n\frac{2n}{i}-1\)

然后考虑 \(N=1\) 的情况,这等效于一条链。

\(g_i\) 为当前走到位置 \(i\) 的期望步数,所求 \(g_{M}\)\(g_i=\frac{g_{i-1}+g_{i+1}}{2},g_0=0\)

可以推得 \(g_M=M^2\)(手解前面几项即可)。

那么答案就是 \(f_N·g_M\),可以理解为解决一条链期望 \(M^2\) 次直接算上去。

E

考虑前缀的答案可以这么来:\(ans_{i}=2ans_{i-1}+h_i\),其中 \(h_i\) 是位置 \(i\) 必选,\(i\) 与选的前面那个数产生的贡献之和,也就是 \(h_i=\sum_{0<j<i}2^{j-1}\gcd(a_i,a_j)\)

这个式子的计算很经典,我们枚举 \(d|a_i\)(根据值域限制这个数很小,大概只有一百个最多),则可以轻易计算 \(\sum_{0<j<i}2^{j-1}[d|a_j]\),我们乘上系数 \(\varphi(d)\)\(\sum_{d|n}\varphi(d)=n\)) 求和即可得到最终答案。

ARC 187

A

手玩可以发现 \(n=2\) 时非常容易构造无解,可以特判,以下假设 \(n\ge 3\)

注意到次数非常多,所以考虑划分子问题,下面我们做这样一个工作:

  • 通过调整,令 \(a_1<\min(a_2,a_3\dots a_n)\),且 \(a_{n-1}<a_n\),这样就变成了一个子问题,再对 \([a_2,a_3\dots a_{n-1},a_n]\) 重复调整即可。

首先,如果我们声明,任意时刻都可以做到这个操作,则对于 \(n\ge 3\) 都是存在方案调整到合法的。

手玩一下,可以发现如下基本操作:

  1. 依次操作 \(i-1,i-2\dots i-j\),可以做到将 \(a_i\) 往前移动 \(j\) 个位置,然后 \(a_{i-j}\sim a_{i-1}\) 整体前移。同时 \(a_i\) 这个值增加 \(j·k\)
  2. 操作两次 \(i\),可以做到 \(a_i,a_{i+1}\) 同时增加 \(k\)

那么首先我们考虑让 \(a_{n-1}<a_n\)

找到最大的 \(x\) 满足 \(a_x<a_{x+1}\),将后面的数字全部移到前面去。如果找不到,说明原序列递减,此刻我们不断连续操作两次 \(n-1\) ,让 \(a_{n-2}<a_{n-1}\),然后再将 \(a_{n}\) 移到前面去即可。

其次我们考虑如何让 \(a_1\) 最小。

  1. \(n\equiv 1\pmod 2\) 直接后面全部两两分组,反复做第二类操作即可。
  2. 否则考虑将 \(a_{n-2},a_{n-1},a_n\) 三个单独分组,其余位置用上个策略
    1. 不断将 \(a_{n},a_{n-1}\) 持续增加 \(k\),直到 \(a_{n-2}+k<a_{n-1}\),然后操作 \(a_{n-2}\),这样 \(a’_{n-1}=a_{n-2}+k<a_n\)
    2. 不断执行上述操作即可。

精细分析可以知道,假设 \(n,k,a_i\) 同阶,操作上界是 \(O(n^3)\) 的。

B

可以发现最终的连通块对应原序列必然是连续的区间,而 \(i\) 作为分界点,当且仅当 \(\min_{j\le i} a_j>\max_{j>i}a_j\)

可以枚举分界点位置计算答案。详细的说,我们通过正反dp计算:\(f_{i,j}:\min_{k\le i} a_{k}=j\) 的方案数,\(g_{i,j}:\max_{k\ge i}a_k=j\)

这个容易用前缀和优化到 \(O(n^2)\),然后枚举分界点 \(i:\sum _{x>y}f_{i,x}·g_{i+1,y}\)

注意还需要算一下所有序列个数(至少有一个连通块)

C

题意的 \(Q\) 其实是 \(P\) 做了一轮冒泡排序的结果。

一个有意思的结论是:

  1. \(Q_n=n\)
  2. 除了 \(1\),每个 \(Q\) 的前缀最大值在 \(P\)可能作为前缀最大值且互相独立。

意思就是,设 \(c=\sum_{i=2}^n\max_{j<i}q_j<q_i\),则这个 \(Q\) 对应了 \(2^c\)\(P\)

唯一对应

因此可以考虑 \(dp\),设 \(f_{i,j,k}\) 为已经填了前 \(i\) 个,前缀最大值是 \(j\),当前的 \(c\)\(k\)

注意到 \(c\) 代表一个 \(2\) 的系数,所以可以直接扔进 dp里面而不单独记录,因此只需要 \(f_{i,j}\) 即可。

同时我们记录 \([1,i]\)\(-1\) 个数以及 \(q\) 给定的数字有哪些,就可以通过前缀和完成转移(每次只需要考虑会不会更新最大值即可)

最终答案是 \(f_{n,n}-f_{n-1,n}\),因为你要保证 \(Q_n=n\)

D

有意思。不妨假定 \(a_i<b_i\)

考虑枚举 \(c_1\)\(a_1\) 还是 \(b_1\),那么后续的填法有:

  1. \(b_i<c_1\),则显然取 \(b_i\)
  2. \(a_i>c_1\),则显然取 \(a_i\)

否则就有 \(c_1\in [a_i,b_i]\),则保留的这些区间是有共点的。

则若有 \([a_i,b_i]\sub [a_j,b_j]\),则 \([a_i,b_i]\) 是无用的。这是因为 \([a_j,b_j]\) 确定取法之后,\([a_i,b_i]\) 选这个方向取一定不会让答案变大。

所以最后留下来的就只有若干的不包含的 \([a_i,b_i]\),其实若 \(b_i<c_1\),不妨看作 \([b_i,\inf]\)\(a_i>c_1\) 同理看作 \([1,a_i]\)

那么下面我们用 \([l_i,r_i]\) 来描述,这些区间互不包含且相交,那么一定有:假设 \(l\) 单调递增,则 \(r\) 单调递增,且答案可以描述为:

\(\min r_{i}-l_{i+1}\)

\(<i\) 的位置全部取 \(r\)\(>i\) 的位置全部取 \(l\)

注意特判边界。

那么我们用 multiset 维护区间,同时用 multiset 去维护 \(r_i-l_{i+1}\) 的集合即可。

实现较为困难。

E

  • 无法操作时 \(ans=0\)

  • 是一个排列时 \(ans=1\)

  • 所有数字相同时,\(ans=n!\)

    构造很简单,对于任意排列 \(p\),首先找到唯一位置 \(a_i=p_i\),以这个位置作为环的起点,不断令当前段最左侧的元素合法,其余不变,最后一次操作时一步到位即可。

同时注意到每次三个相同的数字进行操作后,至少会保留一个数字不动

所以最终局面数字集合不会更少 废话

一段相同数字,最少会保留一个位置不变,这说明若有两段不相邻的相同数字,则无解。

这说明每个数字所在连续段唯一啊。

并且通过操作,我们还可以知道我们可以任意变换各个段的长度,以及甚至可以做到轮转?

因此事实上我们只关心这个颜色序列?

由于我们已经判掉了无法操作的情况,所以至少存在一段 \(\ge 3\),通过这一段就可以实现各个段的长度任意变换。

真的任意吗?不是的,我们时刻需要保证现在可以操作,也就是说只要存在一段长度 \(\ge 3\) 都是等效的。

所以我们只关心这个颜色序列,且由于一种颜色其两侧颜色始终不会变化,且不出现重复,所以甚至我们只关心这个颜色种类数。

不妨设种类数是 \(m\),那么答案是一个关于 \(n,m\) 的多项式,至于它具体是什么?

考虑最后一步的情况,我们就可以知道 \(p\) 里至少有两个数字不在 \(a\) 中出现且距离差不超过 \(2\)

猜一手这玩意充分,因为其余位置我们可以任意移动变换操作,只有最后一步给出了如下限制。

注意这个距离是在环上的距离

我们猜一手满足以下条件即可:

  1. \(p\) 看作循环, \(a_i,a_j\) 相对位置不变
  2. \(p\) 看作循环,至少有两个不在 \(a\) 里出现且距离差不超过 \(2\) 的元素。

第二个条件反着来很容易啊,任意一对距离差都 \(\ge 3\) 是简单的。

考虑将 \(a\) 插入这些新出现的数字的空位之中,相当于相邻两个之前至少会有 \(2\) 个。

由于是环,我们枚举第一个和最后一个新出现的数字之间的个数,同时再利用插板法计算序列版本的答案即可。

注意循环同构串。

事实上这足以应付 \(m\le n-3\) 的情况,

感觉那个循环同构的 \(p\) 都能被生成吧。但是其实这是错的,当 \(m=n-2\) 时。

因为等效状态是错的。

\(m=n-2\),我们的等效状态数是固定的,并且取决于 \(m\) 的奇偶性。

  • \(m\) 是奇数时候,任意循环同构状态都可以得到
  • \(m\) 是偶数时候,只能得到循环移动偶数次的状态。

手推有 \(ans=4nm-[m\equiv 0\pmod 2]2nm\)

\(n=4\) 的时候会出错,\(ans_4=24\)

posted @ 2024-11-13 19:33  spdarkle  阅读(8)  评论(0)    收藏  举报