社区讨论

【求调】过了样例,但RE了

P2486[SDOI2011] 染色参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mbudhogx
此快照首次捕获于
2025/06/13 13:34
8 个月前
此快照最后确认于
2025/06/13 20:11
8 个月前
查看原帖
CPP
#include<cstdio>
#include<vector>
typedef long long ll;
// IO
#define getchar_unlocked getchar
#define putchar_unlocked putchar
inline ll read(){
	char c=getchar_unlocked();
	int w=1;ll ret=0;
	while(!(c>='0'&&c<='9')){if(c=='-')w=-1;c=getchar_unlocked();}
	while(c>='0'&&c<='9'){ret=ret*10+(c^48);c=getchar_unlocked();}
	return ret*w;
}
void write(ll x){
	if(x<0){
		putchar_unlocked('-');
		x=-x;
	}
	if(x>9)write(x/10);
	putchar_unlocked(48+(x%10));
}
// print
#include<cstring>
#include<iostream>
inline void print(std::string s){
	std::cout<<"[system] "<<s<<"\n";
}
// Data
const int N=1e5+10;
int n,m,u,v,w;
char c;
ll col[N];
struct node{
	ll lc,rc,tag;
	int s;
	bool empty(){return (lc==rc&&rc==tag&&tag==-1)&&(s==0);}
};
inline node merge(node a,node b){
	if(a.empty())return b;
	if(b.empty())return a;
	node ret;
	ret.tag=-1;
	ret.lc=a.lc,ret.rc=b.rc;
	ret.s=a.s+b.s;
	if(a.rc==b.lc)--ret.s;
	return ret;
}
// SGT
#define ls(p) (p<<1)
#define rs(p) (p<<1|1)
struct SGT{
	ll data[N];
	node tree[N<<2];
	inline void pushup(int p){
		tree[p].lc=tree[ls(p)].lc;
		tree[p].rc=tree[rs(p)].rc;
		tree[p].s=tree[ls(p)].s+tree[rs(p)].s;
		if(tree[ls(p)].rc==tree[rs(p)].lc){
			--tree[p].s;
		}
	}
	void build(int p,int pl,int pr){
		tree[p].tag=-1;
		if(pl==pr){
			tree[p].lc=tree[p].rc=data[pl];
			tree[p].s=1;
			return ;
		}
		int mid=pl+(pr-pl>>1);
		build(ls(p),pl,mid);
		build(rs(p),mid+1,pr);
		pushup(p);
	}
	inline void addtag(int p,ll k){
		tree[p].lc=tree[p].rc=k;
		tree[p].s=1;
		tree[p].tag=k;
	}
	inline void pushdown(int p){
		if(tree[p].tag!=-1){
			addtag(ls(p),tree[p].tag);
			addtag(rs(p),tree[p].tag);
			tree[p].tag=-1;
		}
	}
	void modify(int p,int pl,int pr,int L,int R,ll k){
		if(L<=pl&&pr<=R){
			addtag(p,k);
			return ;
		}
		pushdown(p);
		int mid=pl+(pr-pl>>1);
		if(L<=mid)modify(ls(p),pl,mid,L,R,k);
		if(mid<R)modify(rs(p),mid+1,pr,L,R,k);
		pushup(p);
	}
	node query(int p,int pl,int pr,int L,int R){
		if(L<=pl&&pr<=R){
			return tree[p];
		}
		pushdown(p);
		int mid=pl+(pr-pl>>1);
		node lt={-1,-1,-1,0},rt={-1,-1,-1,0};
		if(L<=mid)lt=query(ls(p),pl,mid,L,R);
		if(mid<R)rt=query(rs(p),mid+1,pr,L,R);
		return merge(lt,rt);
	}
}st;
// CTT
namespace CTT{
	std::vector<int>G[N];
	int dep[N],siz[N],son[N],fa[N],top[N],dfn[N],rnk[N],cnt;
	void dfs1(int u,int fat){
		dep[u]=dep[fat]+1;
		fa[u]=fat;
		siz[u]=1;
		for(auto v:G[u]){
			if(v==fat)continue;
			dfs1(v,u);
			siz[u]+=siz[v];
			if(!son[u]||(siz[v]>siz[son[u]])){
				son[u]=v;
			}
		}
	}
	void dfs2(int u,int t){
		top[u]=t;
		dfn[u]=++cnt;
		rnk[cnt]=u;
		if(!son[u])return ;
		dfs2(son[u],t);
		for(auto v:G[u]){
			if(v==son[u])continue;
			if(v==fa[u])continue;
			dfs2(v,v);
		}
	}
	inline void init(int root){
		cnt=0;
		for(int i=1;i<=n;++i)
			dep[i]=siz[i]=son[i]=fa[i]=top[i]=dfn[i]=rnk[i]=0;
		dep[root]=1;
		dfs1(root,0);
//		print("dfs1 done");
		dfs2(root,root);
//		print("dfs2 done");
		return ;
	}
	inline node query(int x,int y){
		int fx=top[x],fy=top[y];
		node xt={-1,-1,-1,0},yt={-1,-1,-1,0},tmp;
		while(fx!=fy){
			if(dep[fx]>=dep[fy]){
				tmp=st.query(1,1,n,dfn[fx],dfn[x]);
				xt=merge(xt,tmp);
				x=fa[fx];
			}else{
				tmp=st.query(1,1,n,dfn[fy],dfn[y]);
				yt=merge(yt,tmp);
				y=fa[fy];
			}
			fx=top[x];
			fy=top[y];
		}
		if(dfn[x]<=dfn[y]){
			tmp=st.query(1,1,n,dfn[x],dfn[y]);
			xt=merge(xt,tmp);
			return merge(xt,yt);
		}else{
			tmp=st.query(1,1,n,dfn[y],dfn[x]);
			yt=merge(yt,tmp);
			return merge(yt,xt);
		}
	}
	inline void modify(int x,int y,ll k){
		int fx=top[x],fy=top[y];
		while(fx!=fy){
			if(dep[fx]>=dep[fy]){
				st.modify(1,1,n,dfn[fx],dfn[x],k);
				x=fa[fx];
			}else{
				st.modify(1,1,n,dfn[fy],dfn[y],k);
				y=fa[fy];
			}
			fx=top[x];
			fy=top[y];
		}
		if(dfn[x]<=dfn[y]){
			st.modify(1,1,n,dfn[x],dfn[y],k);
		}else{
			st.modify(1,1,n,dfn[y],dfn[x],k);
		}
		return ;
	}
};
using namespace CTT;
// Main
int main(){
	n=read(),m=read();
	for(int i=1;i<=n;++i)
		col[i]=read();
	for(int i=1;i<n;++i){
		u=read(),v=read();
		G[u].push_back(v);
		G[v].push_back(u);
	}
	init(1);
//	print("init done");
	for(int i=1;i<=n;++i){
		st.data[i]=col[rnk[i]];
	}
	st.build(1,1,n);
//	print("st.build done");
	for(int i=1;i<=m;++i){
		c=getchar_unlocked();
		u=read(),v=read();
		if(c=='C'){
			w=read();
			modify(u,v,w);
		}else{
			write(query(u,v).s),putchar_unlocked('\n');
		}
	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...