4 月做题记录

4.1-4.12

P9531 [JOISC 2022] 复兴计划

考虑每条边出现的时间,不难发现是一个区间,所以我们可以对于每条边,找出出现时间,然后扫描线即可。

出现时间这个问题,可以直接暴力,均摊复杂度是对的!!十分震撼。

image

image

P8026 [ONTAK2015] Bajtocja

考虑对于每个点,哈希维护在每一张图的并查集祖先,启发式合并即可,复杂度 \(O(nd\log n)\)

P10432 [JOISC 2024] 滑雪 2 (Day1)

困难性质题。

P1758 [NOI2009] 管道取珠

考虑平方组合意义即可。

P10197 [USACO24FEB] Minimum Sum of Maximums P

按关键点划分成若干区间,然后我们考虑把剩下的数往里面放,不难发现确定了区间里面的数的集合,一定是从大到小或者从小到大,其次我们可以发现,不同的区间一定是不交或者包含的,证明是简单的,这样我们就可以按值排序后可以区间 dp,同时状压选了满足了哪些区间即可,复杂度 \(O(n3^k+n^22^kk)\)

P10064 [SNOI2024] 公交线路

首先我们等价于任意两个叶子节点,通过一条边能到达的点集有交,不难发现这些点集构成一个连通块,然后可以点边容斥,直接做是 \(O(n^3)\) 的,子树外的点不需要容斥,直接计算即可做到 \(O(n^2)\)

P3772 [CTSC2017] 游戏

用贝叶斯定理+ddp 维护即可。

P8426 [JOI Open 2022] 放学路 / School Road

首先找到 \(1\to n\) 的路径上的所有点双,不难发现只有中间的点可以到达,然后我们可以考虑广义串并联方法,发现如果合法,那么我们看起来似乎能缩成一条 \(1\to n\) 的边,这个结论是对的!所以我们就可以直接广义串并联方法即可。

P9257 [PA 2022] Mędrcy

如果第 \(x\) 天有人走掉,说明能找到 \(x\) 个人,他们的交为空。

考虑补集转化一下,变成选出 \(x\) 个人的覆盖全集,由于每种颜色只有两个人不知道,考虑连边,问题变成最小点覆盖,这个可以在度数 \(>2\) 的时候找出最大的暴搜,小的部分可以直接贪心,发现状态数为 \(T(n)=T(n-1)+T(n-3),T(30)=58425\),复杂度为 \(O(T(k)(n+m))\),可以通过。

P7054 [NWRRC 2015] Graph

贪心,考虑当前 deg=0 的点,以及是否能再次操作,还有操作后的点什么时候放。

P5572 [CmdOI2019] 简单的数论题

\(n\le m\),推一下式子:

\[\begin{aligned} ans&=\sum_{i=1}^n\sum_{j=1}^m\varphi(\frac {ij}{\gcd(i,j)^2})\\ &=\sum_{d=1}^n\sum_{i=1}^{\frac n d}\sum_{j=1}^{\frac md }\varphi(ij)[\gcd(i,j)=1]\\ &=\sum_{d=1}^n\sum_{i=1}^{\frac n d}\sum_{j=1}^{\frac m d}\varphi(i)\varphi(j)[\gcd(i,j)=1]\\ &=\sum_{d=1}^n\sum_{i=1}^{\frac n d}\sum_{j=1}^{\frac m d}\varphi(i)\varphi(j)\sum_{t|\gcd(i,j)}\mu(t)\\ &=\sum_{d=1}^n\sum_{t=1}^{\frac n d}\mu(t)\sum_{i=1}^{\frac n {td}}\varphi(it)\sum_{j=1}^{\frac m {td}}\varphi(jt)\\ &=\sum_{T=1}^n\sum_{d|T}\mu(d)\sum_{i=1}^{\frac n T}\varphi(id)\sum_{j=1}^{\frac m T}\varphi(jd) \end{aligned} \]

\(G(n,t)=\sum_{i=1}^n\varphi(it)\)\(G\) 只有 \(O(n\log n)\) 个,可以预处理。

所以

\[ans=\sum_{T=1}^n\sum_{d|T}\mu(d)G(\frac nT,d)G(\frac m T,d) \]

考虑如何优化,对于 \(T\le \sqrt V\) 的部分,直接暴力计算,\(O(\sqrt V\log V)\)

对于 \(T\ge \sqrt V\),此时 \(\frac n T,\frac m T\le \sqrt V\),那么我们对于 \(a,b\) 暴力预处理出来关于 \(T\) 的前缀和即可,\(a \times T\le V\),所以总状态数是 \(O(V\sqrt V)\) 的,复杂度 \(O(V\sqrt V\log V)\)

总复杂度 \(O((T+V)\sqrt V\log V)\)

P10004 [集训队互测 2023] Permutation Counting 2

考虑二项式反演,钦定有原排列和逆排列有 \(x,y\) 个上升段,然后二项式反演可以逐步转移。

有一个显然的结论:一个原排列中的连续上升段,段内的值的位置一定也是上升的。也就是说,原排列中一段连续上升的元素,是按照其原顺序被划分至逆排列的若干个上升段的。

然后我们考虑记 \(c_{x,y}\) 表示划分到第 \(x,y\) 个上升段的数的个数,那么我们就要求一个 \(x\times y\) 的矩形,每行每列为正数,和为 \(n\) 的方案数,可以直接插板然后反演。

P11394 [JOI Open 2019] 病毒实验 / Virus Experiment

考虑 boruvka,每个连通块选择一个能被所有点到达的点,然后直接暴搜即可,复杂度 \(O(nm\log {nm})\)

P8519 [IOI 2021] 钥匙

套用上面的做法即可。

CF2039F2 Shohag Loves Counting (Hard Version)

考虑经过简单转化后,变成求所有单调递减序列 \(a_n\),使得 \(\gcd(a_1,\ldots a_i)>\gcd(a_1,\ldots a_{i+1})\),此时存在 \(2^{n-1}\) 的贡献。

然后从大到小 dp,\(f_{i,j}\) 表示考虑到 \(i\)\(\gcd=j\) 的方案数,然后容斥转移。

这个问我们需要对于每个 \(m\) 计算,考虑转置原理。

然后转移原理有一下运算:

\[\begin{aligned} swap(x,y)&\Rightarrow swap(x,y)\\ x\gets kx&\Rightarrow x\gets kx\\ x\gets x+ky&\Rightarrow y\gets y+kx \end{aligned} \]

还可以发现:

\[\begin{aligned} &\ x\gets y\ 等价于\ x\gets 0x,x\gets x+y\\ &\Rightarrow y\gets x+y,x\gets 0 \end{aligned} \]

CF1666K Kingdom Partition

首先我们将一个点 \(u\) 是否在 \(A,B\) 内表示成为 \(a_u,b_u\),那么我们贡献是:

\[w\times (a_u\times (1-b_v)+a_v\times (1-b_u)+b_v\times (1-a_u)+b_u\times (1-a_v)) \]

然后发现这个就是最小割,发现 \(a_u=b_u=1\) 的时候似乎不大对,但是发现这个时候贡献和分到 C 集合一样,所以就完了。

CF1738G Antincreasing Addicts

考虑不存在 \(k\) 个单调递增的方格的最多数量,我们知道就是用 \(k-1\) 条反链能最多覆盖的数量,然后发现就是题目允许我们保留的数量,所以对于从左下到右上的每一条斜线,我们要保留 \(\min(cnt,k-1)\) 个数。

发现等价于 \(k-1\) 条左下到右上的路径,这个可以直接考虑预处理之后贪心。

[ARC132F] Takahashi The Strongest

考虑计算所有都不同的方案数,然后我们发现,令 \(R\oplus R\to \{R,S\},R\oplus P\to\{R,S,P\}\) 即可。

发现我们只有 \(4\) 个集合,状压成为 \(4\) 进制,则我们需要满足:

\(c_0\times c_0=c_1\times c_1=c_2\times c_2=1\)

\(c_0c_1=c_0c_2=c_1c_2=c_3\)

然后我们直接找到 \([1,0,0,0],[0,1,0,0],[0,0,1,0],[1,1,1,1]\) 四组解,然后 FWT 即可。

[ARC137E] Bakery

简单网络流。

4.13-4.19

P4898 [IOI 2018] seats 排座位

首先一个想法是对于每个 \(i\) 维护是否可能成为答案,然后对于 \(\le i\) 的数,找到 \(\max x,\min x,\max y,\min y\),然后判断差的乘积减去 \(i\)\(0\)\(i\) 的数量。

但是发现这个不好修改。

然后一个人类智慧的地方在于,找出其他的充要条件。

我们将 \(\le i\) 的看成黑点,\(>i\) 的看成白点。

我们需要仅存在一个黑点满足左和上都是白的,且满足对于所有白点,我们周围四联通内仅存在不超过一个黑点。

证明是不困难的。

我们对于每个方格考虑贡献即可,我们可以发现,这两种个数的和 \(\ge 1\),所以我们维护最小值和最小值个数即可。

修改的时候只会影响四联通的不超过 \(10\) 个格子,直接修改即可,复杂度 \(O((nm+q)\log nm)\)

P10008 [集训队互测 2022] Range Minimum Element

感觉,就是 AGC056B 不过把下标限制变成值域,然后加一个插值。

P11458 [USACO24DEC] All Pairs Similarity P

考虑暴力做法是对于每个数,进行 FWT。

所以我们直接考虑转置原理即可。

贴个代码:

Code
// Problem: P11458 [USACO24DEC] All Pairs Similarity P
// URL: https://www.luogu.com.cn/problem/P11458
// Memory Limit: 512 MB
// Time Limit: 2000 ms
// Time: 2025-04-17 11:15:25

#include<bits/stdc++.h>
#define int long long
#define pc(S) __builtin_popcount(S)
using namespace std;
const int N=1<<20|5,H=1e9+7;
inline int inv(int x){return x<=1?1:(H-H/x)*inv(H%x)%H;}
int n,K,tot,a[N],ans[N],f[N],f2[N],c1[N],c2[N];
inline void add(int &a,int b){a=(a+b)%H;}
inline void fwt(int *F){
	for(int mid=1;mid<tot;mid<<=1)
		for(int i=0;i<tot;i+=mid<<1)
			for(int j=0;j<mid;++j){
				int v1=F[i+j],v2=F[i+j+mid];
				F[i+j]=v1,F[i+j+mid]=(v1+v2)%H;
			}
}
inline void rev_fwt(int *F){
	for(int mid=tot>>1;mid;mid>>=1)
		for(int i=0;i<tot;i+=mid<<1)
			for(int j=0;j<mid;++j){
				int v1=F[i+j],v2=F[i+j+mid];
				F[i+j]=(v1+v2)%H,F[i+j+mid]=v2;
			}
}
inline void rev_ifwt(int *F){
	for(int mid=tot>>1;mid;mid>>=1)
		for(int i=0;i<tot;i+=mid<<1)
			for(int j=0;j<mid;++j){
				int v1=F[i+j],v2=F[i+j+mid];
				F[i+j]=(v1+H-v2)%H,F[i+j+mid]=v2;
			}
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>n>>K,tot=1<<K;
	for(int i=1;i<=n;++i) cin>>a[i],++c1[a[i]],c2[a[i]]+=pc(a[i]);
	for(int S=1;S<tot;++S) f[S]=inv(pc(S));
	rev_ifwt(f),fwt(c1),fwt(c2);
	for(int S=0;S<tot;++S) f2[S]=f[S]*c2[S]%H,f[S]=f[S]*c1[S]%H;
	rev_fwt(f),rev_fwt(f2);
	for(int S=0;S<tot;++S) ans[S]=(f[S]*pc(S)+f2[S]-n+H)%H;
	for(int i=1;i<=n;++i) cout<<ans[a[i]]<<"\n";
}

P4708 画画

直接考虑 burnside,然后接下来就是考虑我们需要每个点度数是偶数。

考虑每个环内部是否可以让点度数异或 \(1\),然后考虑两两之间是否可以,然后计算是简单的。

似乎如果要求联通除了 GF 没有直观推法?

P5438 【XR-2】记忆

考虑最多的方法是每个等价类放在一起,所以答案是 \(r-l-\) 等价类数量。

考虑枚举每个等价类是否存在:

\[\sum_{i=1}^r\mu^2(i)[\lfloor \sqrt{\frac ri}\rfloor>\lfloor \sqrt{\frac {l-1}i}\rfloor] \]

然后我们可以对于后者数论分块。

  • \(i\le r^{\frac 1 3}\) 的时候,只有 \(O(r^{\frac 1 3})\) 种情况。
  • \(i\ge r^{\frac 1 3}\) 的时候,\(\lfloor \sqrt{\frac ri}\rfloor\)\(\lfloor \sqrt{\frac {l-1}i}\rfloor\) 都只有 \(O(r^{\frac 13})\) 种。

所以现在的问题是快速计算 \(\sum_{i=1}^r\mu^2(i)\)

我们考虑:

\[\sum_{i=1}^r\mu^2(i)=\sum_{d=1}^{\sqrt r}\mu(d)\frac {r}{d^2} \]

证明:

我们需要计算有多少个数不含平方因子,考虑 \(r\) 减去 \(2^2,3^2\) 的倍数,加上 \(6^2\) 的倍数,\(\ldots\),发现容斥系数就是 \(\mu\),所以得证。

然后对于这个直接预处理 \(O(\sqrt r)\)\(\mu\) 前缀和,然后数论分块即可。

我怎么复杂度算出来是 \(O(r^{\frac 5 9})\) 的,laofu 说这玩意单次是 \(O(r^{\frac 4 9})\) 的,那就这样吧。

P5206 [WC2019] 数树

\(op=0\) 简单,\(y=1\) 也简单,特判。

\(op=1\),考虑我们知道:

\[y^K=\sum_{i=0}^K\binom K i(y-1)^i \]

所以我们如果对于有 \(K\) 条边,我们有 \(y^K\) 的贡献,那么我们就可以对于每条边带上 \(K-1\) 的贡献即可。

由于对于每棵树,我们的贡献是 \(y^{n-|T_1\cap T_2|}\),然后断掉 \(K\) 条边后的每个连通块大小是 \(a_i\),我们可以由 prufer 序列得到生成树数量,所以我们计算答案:

\[\begin{aligned} ans&=n^{n-k-2}y^{n}(\frac 1y-1)^k\prod a_i\\ &=n^{n-2}y^n(\frac {1-y}{ny})^k\prod a_i \end{aligned} \]

然后 \(\prod a_i\) 可以直接组合意义,做到 \(O(n)\) dp。

对于 \(op=2\),我们考虑推式子。

首先,我们知道:

\[\sum_{P\subset T\subset S}(-1)^{|T|-|P|}=[S=P] \]

\[\begin{aligned} ans&=\sum_{E_1}\sum_{E_2}y^{n-|E_1\cap E_2|}\\ &=\sum_{E_1}\sum_{E_2}\sum_{T\subset |E_1\cap E_2|}\sum_{P\subset T}(-1)^{|T|-|P|}y^{n-|P|}\\ &=\sum_{T}g^2(T)\sum_{P\subset T}(-1)^{|T|-|P|}y^{n-|P|}\\ &=\sum_{T}g^2(T)y^{n-|T|}\sum_{P\subset T}(-1)^{|T|-|P|}y^{|T|-|P|} &=\sum_{T}g^2(T)y^{n-|T|}(1-y)^{|T|}\\ &=\sum_Ty^{n-k}{1-y}^kn^{2(k-2)}\prod_{i=1}^k a_i^2\\ &=\frac{(1-y)^n}{n^4}\sum_T \frac{n^2y}{1-y} a_i^2 \end{aligned} \]

而每个 \(a\) 的连通块有 \(a^{a-2}\) 种生成树,所以实际上是

\[\frac{(1-y)^n}{n^4}\sum_T \frac{n^2y}{1-y} a_i^{a_i} \]

发现后面的部分就是 exp,直接做即可。

P11352 [NOISG 2024 Finals] Coin

我们按拓扑序考虑,我们合法条件等价于对于只考虑 \(1\sim x\) 的点时,只存在 \(x\) 没有出边,考虑 \(x\sim n\) 时,只有 \(x\) 没有入边。

P5972 [PA 2019] Desant

因为我们只需要考虑对于后面每个数的影响,所以我们 dp 到 \(i\) 时,设 \(b\)\(a_{i+1\sim n}\) 的数排序后的数组,可以只保留 \((b_1,b_2),(b_2,b_3)\ldots\) 有多少个数,状态数不超过 \(O(n3^{\frac n 3})\),复杂度 \(O(n^23^{\frac n 3})\)

CF1034C Region Separation

似乎是傻逼题。

CF762F Tree nesting

先考虑带标号从 \(T\) 映射到 \(S\) 的情况,然后除以 \(T\) 映射到本身方案数即可。

然后 dp,考虑设 \(f_{x,i,S}\) 表示考虑 \(x\) 子树内的点,\(x\) 映射到 \(T\) 中的 \(i\),然后子树连通块内的点对应 \(S\) 的方案数。

然后对于一个 \(i\),枚举一个 \(P\) 转移进入 \(S\) 只需要满足 \(P\)\(T\) 上断掉 \(i\) 后的一个连通块即可,所以复杂度只有 \(O(nm2^m)\),随便过。

贴个代码

Code
#include<bits/stdc++.h>
#define pb push_back
using namespace std;
const int N=1005,K=1<<12|5,H=1e9+7;
int n,m,ans,tot,dv,fa[N],Pos[N];
inline int inv(int x){return x<=1?1:1ll*(H-H/x)*inv(H%x)%H;}
inline void add(int &a,int b){a=(a+b)%H;}
vector<int>G[N],T[N];
vector<pair<int,int>>vec[N];
int f[N][K][13];
inline void dfs1(int x,int F){
	Pos[x]=1<<(x-1),fa[x]=F;
	for(auto v:T[x]) if(v!=F) dfs1(v,x),Pos[x]|=Pos[v];
}
inline void dfs2(int x,int fa){
	for(int i=1;i<=m;++i) f[x][1<<(i-1)][i]=1;
	for(auto v:G[x]) if(v!=fa){
		dfs2(v,x);
		for(int S=tot;~S;--S)
			for(int i=1;i<=m;++i) if(S>>(i-1)&1)
				for(auto [t,w]:vec[i]) if((S&w)==w) add(f[x][S][i],1ll*f[x][S-w][i]*f[v][w][t]%H);
	}
	for(int i=1;i<=m;++i) add(ans,f[x][tot][i]);
}
inline void dfs3(int x,int fa){
	for(int i=1;i<=m;++i) f[x][1<<(i-1)][i]=1;
	for(auto v:T[x]) if(v!=fa){
		dfs3(v,x);
		for(int S=tot;~S;--S)
			for(int i=1;i<=m;++i) if(S>>(i-1)&1)
				for(auto [t,w]:vec[i]) if((S&w)==w) add(f[x][S][i],1ll*f[x][S-w][i]*f[v][w][t]%H);
	}
	for(int i=1;i<=m;++i) add(dv,f[x][tot][i]);
}
signed main(){
	cin>>n;
	for(int u,v,i=1;i<n;++i) cin>>u>>v,G[u].pb(v),G[v].pb(u);
	cin>>m,tot=(1<<m)-1;
	for(int u,v,i=1;i<m;++i) cin>>u>>v,T[u].pb(v),T[v].pb(u);
	dfs1(1,0);
	for(int x=1;x<=m;++x)
		for(auto v:T[x])
			if(v==fa[x]) vec[x].pb({v,tot-Pos[x]});
			else vec[x].pb({v,Pos[v]});
	dfs2(1,0),memset(f,0,sizeof f),dfs3(1,0);
	cout<<1ll*ans*inv(dv)%H<<"\n";
}

[ARC146E] Simple Speed

连续段 dp,每层状态只有 \(O(1)\) 个。

[ARC145F] Modulo Sum of Increasing Sequences

首先我们考虑给每个数加上 \(i-1\),这样变成了单调递增,既我们在 \([0,N+M-1]\) 种选出 \(N\) 个数即可。

\(n=N+M\)

先不考虑序列长度的限制,则

\[\begin{aligned} F(z)&=\prod_{i=0}^{n-1}(1+z^i)\\ \sum_{i=0}[x^{ip+k}]f(z)&=\frac 1 p\prod_{i=0}^{p-1}w^{-ik}_{p}F(w^i_p)\\ ans&=\frac 1 p\prod_{i=0}^{p-1}w^{-ik}_p\prod_{j=0}^{n-1}(1+w^{ij}_p) \end{aligned} \]

我们考虑 \(p|n\) 的情况,那么我们枚举 \(d=\gcd(i,p)\)

所以

\[\begin{aligned} \prod_{j=0}^{n-1}(1+w^{ij}_p)&=(\prod_{j=0}^{p-1}(1+w^{ij}_p))^{\frac n p}\\ &=(\prod_{j=0}^{\frac p d-1}(1+w^{ij}_{\frac p d}))^{\frac {nd}p}\\ &=(1-(-1)^{\frac p d})^{\frac {nd}p}\\ ans&=\frac 1 p\sum_{i=0}^{p-1}w^{-ik}_p(1-(-1)^{\frac p d})^\frac{nd}p\\ &=\frac 1 p\sum_{d=0}^{p-1}(1-(-1)^{\frac p d})^{\frac {nd}p}\sum_{\gcd(i,p)=d}w^{-ik}_p \end{aligned} \]

后面部分作为 \(g(d)\),考虑莫反:

\[\begin{aligned} g(d)&=\sum_{i=1}^{p}[\gcd(i,p)=d]w^{-ik}_p\\ &=\sum_{i=1}^{\frac p d}[\gcd(i,\frac p d)=1]w^{-ik}_{\frac p d}\\ &=\sum_{i=1}^{\frac pd}\sum_{j|i,j|\frac p d}\mu(j)w^{-ik}_{\frac p d}\\ &=\sum_{j|\frac pd}\mu(j)\sum_{i=0}^{\frac {p}{dj}-1}w^{-ik}_{\frac p {dj}}\\ &=\sum_{j|\frac pd}\mu(j)[\frac p{dj}|k]\frac {p}{dj} \end{aligned} \]

然后我们可以预处理出来 \(g(d)\)

然后有序列长度限制,加上一位 \(y\) 即可。

\[ans=[y^N]\frac 1 p\sum_{i=0}^{p-1}(1-(-y)^{\frac p d})^{\frac {nd}p}g(p) \]

此时我们能解决 \(p|n\) 的部分了,如果不满足的话,我们可以对于最后 \(O(p)\) 个数暴力 dp 即可。

复杂度 \(O(n+m+p^3)\)

[ARC133E] Cyclic Medians

考虑计算 \(\sum_{k=1}^V[ans\ge k]\) 的方案数。

首先我们发现,如果对于 \(x_i=y_j\) 之后,那么我们的答案就已经和 \(V\) 无关了。

我们设 \(f(k,0/1)\) 表示划分为 \(k\) 的时候最后一次 \(x_i=y_j=0/1\) 的方案数。

然后由于对称性,我们知道 \(f(k,0)=f(V+2-k,1)\),所以 \(\sum_{k=2}^Vf(k,0)=\sum_{k=2}^Vf(k,1)\),且 \(f(1,1)=V^{n+m}\)

所以我们考虑计算所有 \(x\not=y\) 的情况即可。

\(d=\gcd(n,m)\),则每个等价类要么都是 0/1,则我们计数是简单的。

[ARC138F] KD Tree

首先我们不难考虑设 \(f_{l,r,u,d}\) 表示 \(x\in [l,r],y\in [u,d]\) 这个矩形的点的划分数量,然后枚举划分,不难发现会算重。

怎么办呢,这种情况一般有两个方法,一个是容斥,另外一个是只计算字典序最小的操作。

我们考虑计算给按点的 \(x\)\(y\) 坐标排序之后交替合并起来,形如 \(x_1,y_1,x_2,y_2\ldots\)

然后我们考虑按这个顺序划分,只计算用当前划分能达到且之前划分无法达到的状态。

我们考虑用当前划分出来的状态减去之前的状态。

我们不妨考虑我们在划分 \(x_i\),那么我们首先考虑如果一个 \(x_j\) 能达到:图源:kradcigam

那么我们发现划分重复的部分就是 ABC 依次划分的方案,所以减去 \(f(A)\times f(B)\times f(C)\)

然后考虑划分的是 \(y_j\) 的情况:

我们发现我们必须要满足 \(y_j\) 的划分是 CD/DC,AB/BA,\(x_j\) 的划分是 AC/CA,BD/DB

由于我们发现无论如何 \(y_j\) 中 D 都在 A 前面,且 \(A\) 一定不为空,所以我们需要满足 D 里面不存在点。

然后算重方案就是 CAB,减去即可。

至于计算 \(y_i\) 时,A 部分可能是空的,但是空的方案数为 \(1\),所以没有影响。

[ARC147F] Again ABC String

首先我们可以看成有三个数 \(X+1,Y+1,Z+1\),每次会让其中 \((A,B,C)\) 加上 \((-1,1,0),(0,-1,1),(1,0,-1)\) 的一种,然后每个数在任意时候都要 \(>0\),问加 \(n\) 次的方案数。

然后我们可以看成一个 \(m=X+Y+Z+3\) 的环,然后三个点在上面,每次走一步,不存在两个棋子相遇。

我们用总方案数减去相遇方案数,发现没有用到 \(\bmod 2\) 性质,我们发现,如果 A,B 相遇,然后剩下的,不管是 A 先走,还是 B 先走都是对称的,所以只要有一个棋子走路的情况就可以消掉。

然后只需要计算两个棋子到最后还在一起的情况,发现三个棋子共点的情况多算两遍,但是是偶数,不影响。

所以我们现在就需要计算两个棋子到最后还在一起的情况,列出 GF:

\[\sum_{i\equiv X+1(\bmod m)}(x^{-1}+1+x)^n \]

首先我们知道一个事情:

\[(x^{-1}+1+x)^{2^k}=(x^{-2^k}+1+x^{2^k})(\bmod 2) \]

证明使用 lucas 定理。

所以我们 \(n\) 可以拆成 \(O(\log n)\)\(2^k\) 即可。

此时我们暴力做卷积是 \(O(m\log n)\) 的。

然后我们考虑 \(m\) 较大怎么做,发现此时只有 \(O(\frac n m)\)\(i\)

我们考虑列出式子,同时 \(+n\) 避免负指数影响。

\[\sum_{i\equiv X+1+n(\bmod m)}\prod (1+x^{p_i}+x^{2p_i}) \]

然后我们枚举 \(i\),然后剩下的部分发现可以直接数位 dp 做到 \(O(\log n)\)

根号分治一下就是 \(O(T\sqrt n\log n)\) 了。

[ARC030D] グラフではない

可持久化平衡树板子。

4.21-4.27

P9040 [PA 2021] Desant 2

看成网格最短路,发现特殊边可以暴力处理。

联考不会处理特殊边,唐

P6113 【模板】一般图最大匹配

带花树,似乎就是在奇环的时候是可以取任意点。

所以奇环可以缩成一个点,然后可以染色。

P5417 [CTSC2016] 萨菲克斯·阿瑞

似乎发现用最小的字符集能表示出来的后缀数组和不等式链构成双射,然后容斥 dp 即可。

P10005 [集训队互测 2023] 基础寄术练习题

组合意义是 \(\sum_{a'}\prod {s_i}^{-1}=\prod a_i^{-1}\)

然后第一问就可以直接 dp 了。

第二问套用猎人杀的容斥,推一下贡献系数即可。

P8935 [JRKSJ R7] 茎

神秘 dp 题,考虑除了茎的部分,祖先对于子树内操作的影响是一个后缀被删掉,所以有一个后缀和,然后直接树形背包即可。

CF878E Numbers on the blackboard

考虑扫描线,然后维护每个被合并的连续段,如果可以继续合并就可以,并查集维护,至于最前面一段取的是一个后缀,可以提前维护好。

CF354D Transferring Pyramid

按斜线 dp,发现二操作大小只有 \(O(\sqrt m)\),然后直接 dp 即可。

CF516E Drazil and His Happy Friends

比较神奇的题目,首先按 \(\bmod g=\gcd(n,m)\) 分组。

然后分别考虑每组内男女变快乐的最后时刻,发现一个男生在 \(T\) 时刻让一个女生快乐,然后可以让 \(T+n\bmod m\) 的女生快乐,发现可以看成是这个女生让的,那么我们就是一个同余最短路的形式,由于只有一种物体,所以把环切成若干段取最大值即可。

CF533D Landmarks

分讨若干种情况,小 ds 维护。

CF1930G Prefix Max Set Counting

似乎是简单 dp 题,每个子树按子树最大标号排序,然后按 dfn 序 dp。

CF1152F2 Neko Rules the Catniverse (Large Version)

一眼就是按值域 dp,似乎都写的矩阵快速幂,但是感受一下似乎答案是个 \(O(mk)\) 次多项式,插值即可。

CF1292F Nora's Toy Boxes

每个弱联通块单独考虑,然后倒序考虑操作,由于我们只需要计算了 \(k\) 的操作序列个数,所以每次 \(i\) 取入度为 \(0\) 的点是好的,然后我们就可以直接维护选了哪些入度为 \(0\) 的点,dp 即可,把选的点数量删去可以砍一个 \(O(n)\),这个 trick 在 P3160 中也有用到。

CF1450G Communism

直接考虑 \(F_S\) 表示 S 内部能否划分成为一块,暴力需要考虑 \(O(3^m)\) 枚举,实际上发现此时相交了就可以合并,所以枚举前缀即可,复杂度 \(O(m2^m)\)

[ARC145E] Adjacent XOR

考虑转置一下,变成前缀异或,然后用线性基,每次把前缀需要搞掉的后一个操作,这样只需要 \(O(\log V)\) 变成需要的模样,然后就做完了。

[AGC033F] Adding Edges

考虑如果我们有了 \((u,v),(u,w)\)\(v\) 在树上 \(u,w\) 路径上,则我们可以删除 \((u,w)\),保留 \((u,v),(v,w)\)

所以我们对于每个为根的节点都这么保留,然后每次贪心判断能否加边即可。

[ARC112F] Die Siedler

考虑都转化成为一号,然后我们的操作有两种,暴力枚举并计算,或者跑同于最短路,根号分治选择方法即可。

[AGC070C] No Streak

比较牛的各路计数,先只考虑 \(A,B\)\({-1,1}\),恰好 \(k\) 个折点,然后剩下的 \(0\) 插板计算。

如果不存在不能触碰 \(y=x+1\) 的限制,可以直接插板计算。

存在这个,考虑翻折后删除第一条线段,则发现我们的折点数量变成了 \(k-1\),然后枚举删除的位置,发现是个上指标求和,直接计算即可。

[AGC069D] Tree and Intervals

由于小明的树那个套路,发现是连通块数量,然后考虑连通块数量变化的时候,黑连通块数量如何变化,贪心维护让后面的变化情况最多的即可。

[AGC061F] Perfect Strings

考虑在网格图上走,然后形成若干不交路径,如果确定起点终点就可以考虑 LGV,没有的话我们加入一条对应起点直达终点的新边,对于要经过网格图的加入 \(x,y\) 二元,然后代入值跑二元插值即可。

复杂度 \(O(n^5)\),用特征多项式优化计算 \(\det(A+Bx+Cy)\) 之类的可以做到 \(O(n^4)\)

[AGC061E] Increment or XOR

发现一段如果不进位,那么就可以直接看选了哪些数,如果进了位,就会有一个时刻一段后缀为 \(0\),所以考虑 \(S\to T,S\to 0,0\to T,0\to 0\) 的几种情况,顺带维护选了哪些数即可。

下面的题目都是口胡,没有代码,可能有问题

CF1819E Roads in E City

首先考虑知道关键边的一个生成树怎么办,删掉一条边 \((u,v)\),对于每个端点询问 \(k\) 次,如果不连通,至少有一个端点的错误概率为 \(\frac 1 2\),所以取 \(k=20\) 大概正确。

然后考虑怎么找生成树,删掉每条边,询问,判断是否还联通,不连通就接回去。

CF1372F Omkar and Modes

大概是询问出众数出现次数 \(c\) ,然后先每隔 \(c\) 个询问一次,找到了一个数 \(i\) 之后就可以靠两次询问 \([i-c+1,i]\)\([i,i+c-1]\) 找到众数出现位置,然后就可以分治下去了。

CF1615G Maximum Adjacent Pairs

构造就是芬,考虑首先当作每个的贡献是 \(\lfloor \frac L 2\rfloor\),然后考虑接下来怎么办,对于偶数,设边上是 \((u,v)\),则我们连一条边,表示同时匹配 \((u,v)\),答案 +1,同样的,对于奇数,我们新建一个点 \(t\),连 \((u,t),(t,v)\),那么我们跑最大匹配就可以解决问题。

但是点数是 \(O(n)\) 的,无法通过,考虑优化虚点点数。

我们建一张新图,然后对于奇数的 \((u,v)\) 连边,如果 \(m\ge n\),那么所有点都可以匹配,否则我们可以任意剩下一个点。

对于偶数的 \((u,v)\),如果不在一个连通块,那么这两个连通块连边,此时跑最大匹配,点数是 \(O(V)\) 的,可以通过。

[ARC141F] Well-defined Abbreviation

考虑给出的串,如果存在 \(T\)\(S\) 子串,且 S 不能被删完,那么说明 S 合法,排除这些 \(S\) 能被删完了,如果存在两个串使得分别是 \(AB,BC\) 形式,且 B 不等于 C,那么构造串 \(ABC\),似乎就可以证明合法。

CF1523F Favorite Game

有点魔怔,暴力 dp 是考虑 \(f_{S,i,j}\) 为在第 \(i\) 个点,完成 \(j\) 个,传送状态为 \(S\) 的最小时间。

魔怔的是我们分别考虑传送门和刺杀地点。

如果在传送门,地点无关紧要,我们只需要维护状态,任务数,最小时间。

如果在刺杀地点,时间是知道的,我们维护状态,地点,任务数。

这样我们预处理一些东西后,按时间转移即可。

CF1344F Piet's Palette

看成 \(1,2,3\) xor,三者交换不容易,变成维护 \(a2^0+b2^1\),则现在是两个之间的操作,比较好维护,bitset 优化高斯消元即可。

CF1148G Gold Experience

转补图。

要求我们找到一个 \(\ge k\) 的独立集,或者每个连通块大小 \(\ge 2\)

贪心的找出一个极大的独立集。

大小 \(\ge k\) 直接胜利。

那么我们发现,剩下的点一定和这个独立集里面的点有连边,我们找到每个点连的独立集里面的点即可,由于 \(n-k \ge k\),所以一定有解。

然后我们考虑怎么对于每个点寻找连边,可以整体二分,判断和一个点集是否连边可以 \(O(2^{\omega(V)})\) 容斥。

4.28-5.3

P11348 [KTSC 2023 R2] 团队建设

分块,然后跑决策单调性,存在牛逼 polylog 做法。

P11714 [清华集训 2014] 主旋律

复习这个,考虑 dp 保留边使得为 SCC 方案数。

\(f_S\) 表示只考虑 S 内部的边 S 作为 SCC 方案数,然后用 \(2^{E(S)}\) 减去不是 SCC 的方案数即可。

对于不是 SCC 的方案数,枚举点集 \(T\) 表示钦定 \(T\) 是不存在入度的点,设 \(T\)\(i\) 个 SCC,那么容斥系数是 \((-1)^{i+1}\) 因为 \(\sum_{t=1}^n \binom n t (-1)^{t+1}=1\)

所以设 \(g_S\) 表示 \(S\) 作为 \(T\) 时的容斥系数之和,然后状压转移即可。

P11834 [省选联考 2025] 岁月 C 性质

还是先跑一个主旋律,然后考虑我们需要统计只存在一个 SCC 入度为 \(0\) 的情况,考虑钦定然后我们需要计算 \(f(1)\),推一下容斥系数是 \((-1)^{i+1}i\),然后 dp 即可。

P9528 [JOISC 2022] 蚂蚁与方糖

考虑变成选若干区间,然后区间长度 \(\ge 2L\),然后区间变成选左右端点形式,做 ddp。

P10209 [JOI 2024 Final] 路网服务 2 / Road Service 2

变成区间跳,然后倍增做一下。

CF1284F New Year and Social Network

归纳构造,并查集维护。

CF1270I Xor on Figures

看成我们给定 \(2^k\times 2^k\) 矩阵 \(A,B\),求一个非零位置数最小的矩阵 \(C\),满足 \(C\times B=A\),这里是 \((+,\text{xor})\)

但是神奇的是,B 有性质,满足 \(B^{-1}=B^{2^k-1}\)

所以 \(C=A\times B^{2^k-1}=A\prod_{i=0}^{k-1} B^{2^i}\),由于 \(B\) 只有 \(t\) 个数非零,一次乘法可以做到 \(O(4^kt)\) 而不是 \(O(8^k)\),总复杂度 \(O(4^kkt)\),可以通过。

CF1322E Median Mountain Range

似乎直接转 \(-1\),然后简单分析后维护即可。

CF1889E Doremy's Swapping Trees

似乎是直接建 DAG,然后每个 SCC 可以选择是否翻转,是叶子且大小为 \(2\) 的就不行。

AGC041F Histogram Rooks

考虑暴力点容斥,发现我们只关心一列是否出现过恰好,然后建笛卡尔树,再对恰好容斥一下即可。

AGC038F Two Permutations

拆环,拆贡献,形如网络流形式,做完了。

AGC028E High Elements

贪心确定这一位,然后分成前缀最大值和非前缀最大值的贡献讨论一下即可。

AGC030F Permutation and Minimum

似乎是不困难计数题?因为是 \(\min\),所以从大到小 dp,然后似乎不难。

AGC032F One Third

考虑按 \(\frac 2 3\pi\) 划分,然后染色,放在一个 \([0,\frac 1 3]\) 区间内,现在变成了给定 \(n-1\) 个点,问两端颜色不同的线段的最小值期望,然后套用随机红包的结论即可。

下面的题目都是口胡,没有代码,可能有问题

P5044 [IOI 2018] meetings 会议

建笛卡尔树,发现给定的询问一定一端抵着子树边界,然后考虑合并时候的代价。

然后笛卡尔树上信息合并的时候,发现是一次加法,还有一个对一次函数取 \(\min\) 操作,感受一下,有单调性,就做完了。

P10181 龙逐千灯幻

首先这是凸的,然后考虑斜率大小,\(>\sqrt n\) 只有 \(O(\sqrt n)\) 个点,否则是 \(O(\sqrt n)\) 段,然后怎么做一下来着。

P10627 [JOI Open 2024] 中暑 / Heat Stroke

霍尔定理,然后 dp 一下,发现转移是向前后缀,然后维护一下。

CF1043G Speckled Band

分讨一下,然后用哈希,还有优秀的拆分做一下即可。

posted @ 2025-04-14 12:28  Nityacke  阅读(142)  评论(3)    收藏  举报