这题hack数据是hack什么啊
查看原帖
这题hack数据是hack什么啊
98527
juju527楼主2020/6/11 22:09

rt,hack数据t了

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+5,maxm=2e5+5,maxk=1e5+5;
int e[maxm][2];
vector<int>upd[maxk<<2];
inline int read(){
    register int x=0,y=1;
    register char ch=getchar();
    while(ch<48||ch>57){if(ch==45)y=-1;ch=getchar();}
    while(ch>=48&&ch<=57)x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
    return x*y;
}
void modify(int k,int l,int r,int x,int y,int id){
	if(x>y)return ;
	if(l>y||r<x)return ;
	if(l>=x&&r<=y){
		upd[k].push_back(id);
		return ;
	}
	int mid=l+((r-l)>>1);
	modify(k<<1,l,mid,x,y,id);
	modify(k<<1|1,mid+1,r,x,y,id);
	return ;
}
int f[maxn],d[maxn],rk[maxn];
bool flag;
int tp;
int px[maxn],pd[maxn],pr[maxn];
bool ans[maxk];
int dist;
inline int find(int x){
	if(f[x]==x)return x;
	dist^=d[x];
	return find(f[x]);
}
inline int update(int k){
	int cur=0;
	for(register int i=0;i<upd[k].size();i++){
		int id=upd[k][i];
		int u=e[id][0],v=e[id][1],w=1;
		int x,y;
		dist=0;x=find(u);w^=dist;
		dist=0;y=find(v);w^=dist;
		if(x^y){
			tp++;
			px[tp]=x;f[x]=y;
			pd[tp]=d[x];d[x]=w;
			pr[tp]=rk[y];if(rk[x]==rk[y])rk[y]++;
			cur++;
		}
		else if(w){flag=1;break;}
	}
	return cur;
}
inline void clear(int cur){
	while(cur--){
		int x=px[tp],y=f[x];
		f[x]=x;
		d[x]=pd[tp];
		rk[y]=pr[y];
		tp--;
	}
	return ;
}
inline void solve(int k,int l,int r){
	flag=0;
	int cur=update(k);
	if(flag){
		clear(cur);
		for(register int i=l;i<=r;i++)puts("No");
		return ;
	}
	if(l==r){clear(cur);puts("Yes");return ;}
	int mid=l+((r-l)>>1);
	solve(k<<1,l,mid);
	solve(k<<1|1,mid+1,r);
	clear(cur);
	return ;
}
int main(){
    freopen("【模板】线段树分治.in","r",stdin);
    freopen("【模板】线段树分治.out","w",stdout);
   	int n,m,k;
	n=read();m=read();k=read();
	for(register int i=1;i<=n;i++){f[i]=i;d[i]=0;rk[i]=1;}
	for(register int i=1;i<=m;i++){
		int x,y,l,r;
		x=read();y=read();l=read();r=read();
		e[i][0]=x;e[i][1]=y;
		modify(1,1,k,l+1,r,i);
	}
	solve(1,1,k);
    return 0;
}

2020/6/11 22:09
加载中...