萌新刚学线段树分治求调
查看原帖
萌新刚学线段树分治求调
164580
YGB_XU楼主2022/3/7 12:02

rt,WA on 39

#include<bits/stdc++.h>
using namespace std;

inline int read(){
	int ret=0,f=1;
	char c=getchar();
	while(c<'0'||'9'<c){
		if(c=='-') f=-1;
		c=getchar();
	}
	while('0'<=c&&c<='9'){
		ret=(ret<<1)+(ret<<3)+(int)(c-'0');
		c=getchar();
	}
	return ret*f;
}

inline long long readll(){
	long long ret=0ll,f=1ll;
	char c=getchar();
	while(c<'0'||'9'<c){
		if(c=='-') f=-1ll;
		c=getchar();
	}
	while('0'<=c&&c<='9'){
		ret=(ret<<1ll)+(ret<<3ll)+(long long)(c-'0');
		c=getchar();
	}
	return ret*f;
}

inline void write(int x){
	if(x<0){
		putchar('-');
		x=-x;
	}
	if(x>=10) write(x/10);
	putchar('0'+x%10);
}

inline void writell(long long x){
	if(x<0ll){
		putchar('-');
		x=-x;
	}
	if(x>=10ll) writell(x/10ll);
	putchar('0'+x%10ll);
}

typedef long long LL;

const int NR=5e5+5,KR=55;
int n;
int u[NR],v[NR],a[NR],c[NR],now[NR];//a[i]表示第i个询问涉及的边的编号,c[i]表示第i个询问所代表的颜色,now[i]表示边i当前的颜色
vector<int>q[NR<<2];

int fa[NR<<1][KR],sz[NR<<1][KR];
inline int find(int x,int col){
	while(fa[x][col]!=x) x=fa[x][col];
	return x;
}

int statop=0;
struct Node{
	int u,v,col;
}sta[NR];
inline void merge(int x,int y,int col){
	int rx=find(x,col),ry=find(y,col);
	if(rx==ry) return;
	if(sz[rx][col]>sz[ry][col]) swap(rx,ry);
	fa[rx][col]=ry;
	sz[ry][col]+=sz[rx][col];
	sta[++statop]=Node{rx,ry,col};
}

inline void cancel(){
	int rx=sta[statop].u,ry=sta[statop].v,col=sta[statop].col;
	fa[rx][col]=rx;
	sz[ry][col]-=sz[rx][col];
	statop--;
}

inline void update(int p,int l,int r,int ql,int qr,int k){//k为询问编号
	if(ql>qr) return;
	if(ql<=l&&r<=qr){
		q[p].push_back(k);
		return;
	}
	int mid=(l+r)>>1;
	if(ql<=mid) update(p<<1,l,mid,ql,qr,k);
	if(qr>mid) update(p<<1|1,mid+1,r,ql,qr,k);
}

inline void dfs(int p,int l,int r){
	int tmp=statop;
	for(unsigned int i=0;i<q[p].size();i++){
		int pos=q[p][i];
		int col=c[pos];
		if(col!=0){
			merge(v[a[pos]]+n,u[a[pos]],col);
			merge(u[a[pos]]+n,v[a[pos]],col);
		}
	}
	if(l==r){
		int pos=a[l],col=c[l];
		if(find(u[pos],col)!=find(v[pos],col)&&find(u[pos]+n,col)!=find(v[pos]+n,col)){
			printf("YES\n");
			now[pos]=col;
		}else{
			printf("NO\n");
			c[l]=now[pos];
		}
	}else{
		int mid=(l+r)>>1;
		dfs(p<<1,l,mid);
		dfs(p<<1|1,mid+1,r);
	}
	while(tmp<statop) cancel();
}

vector<int>g[NR];
int main(){
//	ios::sync_with_stdio(false);
	int m,k,t;
	n=read();m=read();k=read();t=read();
	for(int i=1;i<=n*2;i++){
		for(int j=1;j<=k;j++){
			fa[i][j]=i;
			sz[i][j]=1;
		}
	}
	for(int i=1;i<=m;i++){
		u[i]=read();v[i]=read();
	}
	for(int i=1;i<=t;i++){
		a[i]=read();c[i]=read();
		g[a[i]].push_back(i);
	}
	for(int i=1;i<=m;i++){
		if(g[i].size()==0) continue;
		int last=0;
		for(unsigned int j=0;j<g[i].size();j++){
			int ix=g[i][j];
			if(last!=0) update(1,1,t,last+1,ix-1,last);
			last=ix;
		}
		update(1,1,t,last+1,t,last);
	}
	dfs(1,1,t);
	return 0;
}
2022/3/7 12:02
加载中...