QOJ.ac

QOJ

ID提交记录ID题目HackerOwner结果提交时间测评时间
#1610#866881#7139. Planar graphzxc_aC1942huangjiaxuFailed.2025-03-23 17:22:492025-03-23 17:22:50

詳細信息

Extra Test:

Standard Program Time Limit Exceeded

input:

100000 1
1 50001
1 50001
1 50001
1 50001
1 50001
1 50001
1 50001
1 50001
1 50001
1 50001
1 50001
1 50001
1 50001
1 50001
1 50001
1 50001
1 50001
1 50001
1 50001
1 50001
1 50001
1 50001
1 50001
1 50001
1 50001
1 50001
1 50001
1 50001
1 50001
1 50001
1 50001
1 50001
1 50001
1 50001
1 50001
1 50001
1 5...

output:


result:


ID题目提交者结果用时内存语言文件大小提交时间测评时间
#866881#7139. Planar graphC1942huangjiaxuAC ✓445ms95320kbC++141.6kb2025-01-22 20:44:202025-01-22 20:44:22

answer

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,q,se[N],fa[N],co[N],m,cnt=1,ans,vis[N];
vector<int>e[N];
set<int>E[N];
map<int,int>id[N],ie[N];
int gf(int x){
	return fa[x]==x?fa[x]:fa[x]=gf(fa[x]);
}
void bfs(int x,int y){
	queue<int>q0,q1;
	int s0=0,s1=0;
	vector<int>t0,t1;
	q0.push(x),q1.push(y);
	while(!q0.empty()&&!q1.empty()){
		x=q0.front(),y=q1.front();
		if(s0+E[x].size()<s1+E[y].size()){
			q0.pop(),t0.push_back(x);
			s0+=E[x].size();
			for(auto v:E[x])if(vis[v]!=cnt)q0.push(v),vis[v]=cnt;
		}else{
			q1.pop(),t1.push_back(y);
			s1+=E[y].size();
			for(auto v:E[y])if(vis[v]!=cnt)q1.push(v),vis[v]=cnt;
		}
	}
	if(q0.empty())for(auto v:t0)co[v]=cnt;
	else for(auto v:t1)co[v]=cnt;
}
int main(){
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n;++i){
		scanf("%d",&se[i]);
		co[i]=1;
		for(int j=0,x;j<se[i];++j){
			scanf("%d",&x);
			e[i].push_back(x);
			E[i].insert(x);
			id[i][x]=j;
		}
	}
	for(int i=1;i<=n;++i){
		for(auto v:e[i])if(!ie[i][v]){
			ie[i][v]=++m;
			for(int x=v,y=i;;swap(x,y)){
				int z=(id[x][y]+1)%se[x];
				y=e[x][z];
				ie[x][y]=m;
				if(x==i)break;
			}
		}
	}
	for(int i=1;i<=m;++i)fa[i]=i;
	for(int i=1,x,y;i<=q;++i){
		char op=getchar();
		while(op!='-'&&op!='?')op=getchar();
		scanf("%d%d",&x,&y);
		x^=ans,y^=ans;
		if(op=='?'){
			ans=(co[x]==co[y]);
			printf("%d\n",ans);
		}else{
			int u=gf(ie[x][y]),v=gf(ie[y][x]);
			E[x].erase(y),E[y].erase(x);
			if(u!=v){
				fa[u]=v;
				ans=cnt;
			}else{
				ans=++cnt;
				bfs(x,y);
			}
			printf("%d\n",ans);
		}
	}
	return 0;
}