首页 > 其他分享 >2024初三集训模拟测试3

2024初三集训模拟测试3

时间:2024-02-21 21:45:56浏览次数:87  
标签:val int 2024 fa val1 val0 初三 集训 mod

T1 排序

image
读完题就切了。

T2 牛吃草

点击查看题目

image

很明显的单调队列优化DP。

T3 树上的宝藏

image
先不考虑对边进行修改,树形DP处理出每个节点的相关信息。转移感觉有些像前几天的CF1929D

设 \(f_{i,0/1}\) 表示以 \(i\) 为根节点的子树内是否选 \(i\) 的方案数,\(f_{i,2}\) 表示以 \(i\) 为根的字数内的总方案数。显然有:

\[\large\begin{cases}f_{i,0}=\prod{f_{son_i,2}}\\ f_{i,1}=\prod{f_{son_i,0}}\end{cases} \]

处理出所有初始状态后。
如下图:image
其中左边的数代表不选此节点。
这时有两种做法:

My solution:

发现每个点都对它的父节点有固定的单位影响。

这是每个点对父节点的单位影响:
image

根据上图可以求出,具体来说,从上到下依次为,不选这个点时对父亲不选和选的单位影响以及选这个点时对父亲不选和选的单位影响。

求法也比较简单,就是

\[\begin{cases}val_{0->0}=val_{1->0}=\dfrac{f_{fa,0}}{f_{son,2}}\\ val_{0->1}=\dfrac{f_{fa,1}}{f_{y,0}}\\ val_{1->1}=0\end{cases} \]

此时直接做是 \(O(n^2)\) 的时间复杂度。

考虑将每个点对全局方案数的单位影响,因为已经知道每个点对父亲,所以再 dfs 一遍即可处理出来。具体来说,将根节点 \(1\) 到节点 \(i\) 上的单位影响都合成,设 \(a=val_{0->0,x},b=val_{0->1,x},c=val_{1->0,x},d=val_{1->1,x}\) 式子如下,比较繁琐:

\[\begin{cases}val_{0->0,x}=a\cdot(val_{0->0,fa}+val_{1->1,fa})\\ val_{0->1,x}=a\cdot val_{0->1,fa}+b\cdot val_{1->1,fa}\\ val_{1->0,x}=c\cdot val_{0->0,fa}\\ val_{1->1,x}=c\cdot val_{0->1,fa}\end{cases} \]

这是处理完后的情况:
image

最后就是考虑每条边改变后对答案的影响( \(ans\) 数组),就是对它的父亲的影响乘上父亲对整体答案的单位影响即可。

先处理出当这条边为修改边时对父亲的直接影响,如图
image

然后就做完了,\(ans\) 里存的是每个点对答案的改变值。

#include<bits/stdc++.h>
#define int long long
inline int read(){
	char ch=getchar();int x=0,f=1;
	for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
	for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<3)+(x<<1)+(ch^48);
	return x*f;
}
const int N=3e5+10,mod=998244353;
int n,f[N][3],fa[N],tot,head[N],val0[N],val1[N],val2[N],ans[N];
int val0_fa[N],val1_fa[N],val2_fa[N],val0_0[N],val0_1[N],val1_0[N],val1_1[N];
std::vector<int> v[N];
inline int qpow(int a,int b){
	int ans=1;
	for(;b;b>>=1,a=a*a%mod)if(b&1)ans=ans*a%mod;
	return ans;
}
inline int ny(int a){return qpow(a,mod-2);}
inline void dfs(int x,int fu){
	fa[x]=fu;
	if(v[x].size()==1&&v[x][0]==fu){f[x][0]=1,f[x][1]=1,f[x][2]=2;}
	int sum=1,mul=1;
	for(int y:v[x]){
		if(y==fu)continue;
		dfs(y,x);
		mul=mul*(f[y][2])%mod;
		sum=sum*f[y][0]%mod;
	}
	f[x][0]=mul,f[x][1]=sum,f[x][2]=(mul+sum)%mod;
	for(int y:v[x]){
		if(y==fu)continue;
		val0_0[y]=val1_0[y]=val0[y]=mul*ny(f[y][2])%mod;
		val0_1[y]=val1[y]=sum*ny(f[y][0])%mod;
		val0_fa[y]=val0[y]*f[y][0]%mod;
		val1_fa[y]=val1[y]*f[y][1]%mod;
		val2_fa[y]=(val0_fa[y]-val1_fa[y]+mod*2)%mod;
		//处理对父亲单位影响和改变后对父亲的影响
	}
}
inline void dfs1(int x,int fu){
	int y=fu;
	if(fu==1)ans[x]=(-val2_fa[x]+mod)%mod;
	else{
		ans[x]=(val1_fa[x]*(val1_0[y]+val1_1[y])%mod-val0_fa[x]*(val0_0[y]+val0_1[y])%mod+2*mod)%mod;
		//这里是 ans 的处理,意义如上。
		int a=val0_0[x],b=val0_1[x],c=val1_0[x],d=val1_1[x];
		val0_0[x]=(a*val0_0[y]%mod+b*val1_0[y]%mod)%mod;
		val0_1[x]=(a*val0_1[y]%mod+b*val1_1[y])%mod;
		val1_0[x]=(c*val0_0[y])%mod;
		val1_1[x]=(c*val0_1[y])%mod;
		//处理对全局的单位影响和 ans
	}
	for(int y:v[x]){
		if(y==fu)continue;
		dfs1(y,x);
	}
}
struct edge{int u,v;}e[N];
signed main(){
	// freopen("in.in","r",stdin),freopen("out.out","w",stdout);
	std::ios::sync_with_stdio(false);std::cin.tie(0),std::cout.tie(0);
	n=read();
	val0[1]=val1[1]=1;
	for(int i=1;i<n;++i){
		int a=read(),b=read();
		v[a].push_back(b),v[b].push_back(a);
		e[++tot].u=a,e[tot].v=b;
	}
	dfs(1,0);
	dfs1(1,0);
	for(int i=1;i<=tot;++i){
		int son;
		if(fa[e[i].u]==e[i].v)son=e[i].u;
		else son=e[i].v;
		std::cout<<(f[1][2]+ans[son]+mod*2)%mod<<'\n';
	}
}

标签:val,int,2024,fa,val1,val0,初三,集训,mod
From: https://www.cnblogs.com/Ishar-zdl/p/18026190

相关文章

  • 初三年后集训测试---T1排序
    初三年后集训测试$T1$排序$$HZOI$$·题意:给定\(4n\)个整数,求:\[\max\{\sum_{i=1}^{4n}(A_{i,1}\timesA_{i,2}-A_{i,3}\timesA_{i,4})\}\]其中存在\(n\)个这样的集合\(a\),并两两互不相交。·题解:先排序,再将区域划分为两块,从\(2n\)处划分。然后:大的那......
  • P10064 [SNOI2024] 公交线路 题解
    非常好题目。思路可以发现限制最严的一定是两个叶子的联通性。我们不妨把一个叶子向外起到联通性作用的路径称为有用的路径。也就是这个叶子走这条路径一定可以两步以内到达任意点。这个路径集合有什么作用呢。有一个性质:整个集合的路径的交最终会形成一个连通块。那么我们......
  • Solution Set【2024.2.21】
    [ARC162C]MexGameonTree可以发现若Bob在某个节点填了值\(K\),那么会直接导致其根链上的所有节点均不可能满足要求。因此若某个节点的子树内有不小于两个空位,那么Alice一定无法使该子树满足要求。若某节点子树内有一个空位且可以通过填上这一空位使其合法,那么Alice可......
  • 2024年2月21日——霜雪落满头,也算共白首
    今天上午寒霜又镀遍了世界大地上遍布着一层浅金色的冰壳,清晨的天色昏暗无光,一夜的风雨,早已在低温的作用下凝固,碧绿的春叶,枯寒的枝干,全部裹上了透明的镀层,连汽车都被冰封。深呼出一口气,在阳光下又变成了洁白的辰龙吐雾。中午回家的路上,抬头看向天空,一粒粒白色水晶,肆无忌惮......
  • 2024牛客寒假算法基础集训营5
    A.总数-1的个数#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1e5+10;#defineinf0x3f3f3f3fvoidsolve(){intn;cin>>n;intans=0;for(inti=1,x;i<=n;i++){cin>>x;if(x==1)c......
  • 2024牛客寒假算法基础集训营5
    2024牛客寒假算法基础集训营5比赛链接赛时出了五题,被自己不严谨的思维害惨了,之后的题晚几天再补,要开学了A.mutsumi的质数合数思路既不是质数也不是合数恐怕非1莫属了吧Code#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#defineall(x)x.begin()......
  • 初三年后集训测试 T2--牛吃草
    初三年后集训测试$T2$牛吃草一言难尽$$HZOI$$$Description$由于现代化进程的加快,农场的养殖业也趋向机械化。\(QZS\)决定购置若干台自动喂草机来减少自己每天的工作量。为了简化问题,\(QZS\)决定将草地建模成一条线段,总长为\(n\),即共有\(n\)个单位长度,编号从......
  • 2024初三年后集训模拟测试3
    前言比赛链接难度不好说,感觉是东拼西凑的题,但是除了\(T1\)都不简单。\(T1~100pts:\)贪心+四边形不等式。\(T2~70pts:\)读假题了,是最大\(w_i\)不是固定\(w_i\),做法是二分答案+DP,不过需要单调队列优化,不会这玩意儿赛后学了好久\(qwq\)。但是读假题了还能拿......
  • weblogic CVE-2024-20931分析
    weblogic12.2.1.4.0安装我的环境:ubuntu22.04+weblogic12.2.1.4.0+jdk8(注:weblogic不支持OpenJDK)jdk下载安装:https://www.oracle.com/cn/java/technologies/downloads/archive/weblogic下载安装:https://www.oracle.com/middleware/technologies/weblogic-server-install......
  • 2024年!vscode和clangd的配置
    前言Ubuntu20系统下,使用vscode和clangd来进行代码补全和拼写检查.安装vscode直接从Ubuntu的应用商店下载vscode.安装clangd$sudoaptinstallclangd安装vscode插件-clangdvscode安装clangd插件不需要对clangd插件进行配置.不需要对clangd插件进......