玄关,TLE 0pts 求调
查看原帖
玄关,TLE 0pts 求调
1002571
Jordan_Pan楼主2024/8/13 18:41
#include<cstdio>
const int rSiz=1<<21;
char rBuf[rSiz],*p1=rBuf,*p2=rBuf;
#define gc() (p1==p2&&(p2=(p1=rBuf)+ \
	fread(rBuf,1,rSiz,stdin),p1==p2)?EOF:*p1++)
template<class T>void rd(T&x){
	char ch=gc();
	for(;ch<'0'||ch>'9';ch=gc());
	for(x=0;ch>='0'&&ch<='9';ch=gc())
		x=(x<<1)+(x<<3)+(ch^48);
}

#include<bits/stdc++.h>
const int _=1e5+5;
int n,m,k;
std::vector<std::pair<int,int> >t[_<<2];
void Chg(int x,int l,int r,int L,int R,int u,int v){
	if(L<=l&&r<=R){
		t[x].push_back({u,v});
		return;
	}
	if(R<l||L>r)return;
	int mid=(l+r)>>1;
	Chg(x<<1,l,mid,L,R,u,v);
	Chg(x<<1|1,mid+1,r,L,R,u,v);
}
int fa[_<<1],siz[_<<1];bool ans[_];
int Fnd(int x){return x==fa[x]?x:Fnd(fa[x]);}
int sta[_<<1][2],tp,c[_<<2];
int Unn(int x,int y){
	x=Fnd(x),y=Fnd(y);
	if(x==y)return 0;
	if(siz[x]>siz[y])std::swap(x,y);
	sta[++tp][0]=x;sta[tp][1]=y;
	fa[x]=y;siz[y]+=siz[x];
	return 1;
}
void Del(int cnt){
	for(;cnt;cnt--){
		int x=sta[tp][0],y=sta[tp--][1];
		fa[x]=x;siz[y]-=siz[x];
	}
}
void dfs(int x,int l,int r){
	for(auto i:t[x]){
		int u=i.first,v=i.second;
		c[x]+=Unn(u,v+n);
		c[x]+=Unn(v,u+n);
	}
	bool op=1;
	for(int i=1;op&&i<=n;i++)
		if(Fnd(i)==Fnd(i+n))op=0;
	if(l==r){ans[l]=op;Del(c[x]);return;}
	if(!op){Del(c[x]);return;}
	int mid=(l+r)>>1;
	dfs(x<<1,l,mid);
	dfs(x<<1|1,mid+1,r);
	Del(c[x]);
}
int main(){
	rd(n);rd(m);rd(k);
	for(int i=1;i<=m;i++){
		int u,v,l,r;rd(u),rd(v),rd(l),rd(r);
		Chg(1,1,k,l+1,r,u,v);
	}
	for(int i=1;i<=n<<1;i++)fa[i]=i,siz[i]=1;
	dfs(1,1,k);
	for(int i=1;i<=k;i++){
		if(ans[i])printf("Yes\n");
		else printf("No\n");
	}
	return 0;
}
2024/8/13 18:41
加载中...