玄关求助,AC#1,WA#29~32,其余全部RE
查看原帖
玄关求助,AC#1,WA#29~32,其余全部RE
865625
KobeBeanBryantCox楼主2025/8/3 00:48

rt,感觉先解决 RE 会好弄一点。思路跟题解区基本一致。

#include<bits/stdc++.h>
#define Code using
#define by namespace
#define wjb std
Code by wjb;
int in()
{
	int k=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9')k=k*10+c-'0',c=getchar();
	return k*f;
}
void out(int x)
{
	if(x<0)putchar('-'),x=-x;
	if(x<10)putchar(x+'0');
	else out(x/10),putchar(x%10+'0');
}
const int N=1e5+10,L=910;
struct que{int op,x,y;}ask[N];
int n,u[N],v[N];
bool ans[N];
bool cant[N];
namespace ksrj
{
	vector<pair<int,int>>e[N],e2[N];
	void add(int u,int v,int id){e[u].push_back({v,id});e2[v].push_back({u,id});}
	bool vis[N];
	vector<int>s;
	int cnt,num[N];
	void dfs1(int u)
	{
		vis[u]=true;
		for(auto [v,id]:e[u])if(!vis[v]&&!cant[id])dfs1(v);
		s.push_back(u);
	}
	void dfs2(int u)
	{
		num[u]=cnt;
		for(auto [v,id]:e2[u])if(!num[v]&&!cant[id])dfs2(v);
	}
	void kosaraju()
	{
		s.clear(),cnt=0;for(int i=1;i<=n;i++)num[i]=vis[i]=0;
		for(int i=1;i<=n;i++)if(!vis[i])dfs1(i);
		for(int i=n-1;i>=0;i--)if(!num[s[i]])cnt++,dfs2(s[i]);
	}
}
int S[N];
vector<int>G[N];int en[N];
bitset<L>f[N];
void toposort(int len)
{
	queue<int>q;
	for(int i=1;i<=len;i++)if(!en[i])q.push(i);
	while(!q.empty())
	{
		int u=q.front();q.pop();
		for(int v:G[u])
		{
			f[v]|=f[u];
			if(!(--en[v]))q.push(v);
		}
	}
}
int ID[N];
bitset<L>g[N];
int color[N];
bool bfs(int s,int t)
{
	if(s==t)return 1;
	bitset<L>now;now.set();
	queue<int>q;q.push(s);
	while(!q.empty())
	{
		int u=q.front();q.pop();
		bitset<L>tmp=(now&(f[u]|g[u]));
		for(int v=tmp._Find_first();v<L;v=tmp._Find_next(v))
		{
			if(v==t)return 1;
			q.push(v),now.reset(v);
		}
	}
	return 0;
}
void clear(int l,int r,int len)
{
	for(int i=l;i<=r;i++)if(ask[i].op==1)cant[ask[i].x]=0;
	for(int i=1;i<=len;i++)G[i].clear(),en[i]=0;
	for(int i=1;i<=len;i++)f[i].reset(),g[i].reset(),ID[i]=0,S[i]=0;
}
void solve(int l,int r)
{
	for(int i=l;i<=r;i++)if(ask[i].op==1)cant[ask[i].x]=1;
	ksrj::kosaraju();
	int len=0;
	for(int i=1;i<=r;i++)
		if(ask[i].op==1)S[++len]=ksrj::num[u[ask[i].x]],S[++len]=ksrj::num[v[ask[i].x]];
		else S[++len]=ksrj::num[ask[i].x],S[++len]=ksrj::num[ask[i].y];
	sort(S+1,S+len+1),len=unique(S+1,S+len+1)-S-1;
	for(int i=1;i<=len;i++)ID[S[i]]=i,f[i].set(i);
	for(int u=1;u<=n;u++)
		for(auto [v,id]:ksrj::e[u])
		{
			if(cant[id]||ksrj::num[u]==ksrj::num[v])continue;
			G[ID[ksrj::num[v]]].push_back(ID[ksrj::num[u]]),en[ID[ksrj::num[u]]]++;
		}
	toposort(len);
	for(int i=l;i<=r;i++)
	{
		if(!(ask[i].op==1&&color[i]))continue;
		int U=ID[ksrj::num[u[ask[i].x]]];
		int V=ID[ksrj::num[v[ask[i].x]]];
		g[U].set(V);
	}
	for(int i=l;i<=r;i++)
		if(ask[i].op==1)
		{
			color[ask[i].x]^=1;
			int U=ID[ksrj::num[u[ask[i].x]]];
			int V=ID[ksrj::num[v[ask[i].x]]];
			if(!color[ask[i].x])g[U].reset(V);
			else g[U].set(V);
		}
		else ans[i]=bfs(ID[ksrj::num[ask[i].x]],ID[ksrj::num[ask[i].y]]);
	clear(l,r,len);
}
int main()
{
	n=in();int m=in(),q=in();
	for(int i=1;i<=m;i++)color[i]=1,u[i]=in(),v[i]=in(),ksrj::add(u[i],v[i],i);
	for(int i=1;i<=q;i++)
	{
		ask[i].op=in();
		if(ask[i].op==1)ask[i].x=in();
		else ask[i].x=in(),ask[i].y=in();
	}
	const int B=225;
	for(int i=1;i<=q;i+=B)solve(i,min(q,i+B-1));
	for(int i=1;i<=q;i++)if(ask[i].op==2)puts(ans[i]==1?"YES":"NO");
	return 0;
}
2025/8/3 00:48
加载中...