QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#392727#4000. Dynamic ReachabilityXun_xiaoyaoRE 0ms0kbC++144.5kb2024-04-17 19:57:092024-04-17 19:57:09

Judging History

你现在查看的是最新测评结果

  • [2024-04-17 19:57:09]
  • 评测
  • 测评结果:RE
  • 用时:0ms
  • 内存:0kb
  • [2024-04-17 19:57:09]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
int Qread()
{
	int x=0;char ch=getchar();
	while(ch<'0'||ch>'9') ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+(ch^48),ch=getchar();
	return x;
}
const int B=500;
typedef bitset<1000> Bt;
struct Edge{int nxt,poi,typ;}l[100010];
bool del[100010];
int edge_cnt,p[50010];
int n,m,q,u[100010],v[100010];
int op[510],qu[510],qv[510];
bool vis[50010],instk[50010];

int len[50010],stk[50010],top,scc_cnt;
int dfn[50010],low[50010],ind;
int bel[50010];
void Tarjan(int a)
{
	instk[a]=vis[a]=true;
	dfn[a]=low[a]=++ind;
	stk[++top]=a;
	for(int k=p[a];k;k=l[k].nxt) if(l[k].typ&&!del[k])
	{
		if(vis[l[k].poi])
		{
			if(instk[l[k].poi])
				low[a]=min(low[a],dfn[l[k].poi]);
		}
		else
		{
			Tarjan(l[k].poi);
			if(instk[l[k].poi])
				low[a]=min(low[a],low[l[k].poi]);
		}
	}
	if(low[a]==dfn[a])
	{
		scc_cnt++;
		while(top&&stk[top+1]!=a)
		{
			instk[stk[top]]=false,bel[stk[top]]=scc_cnt;
			top--;
		}
	}
}
Bt con[50010],f[1010],S[1010],VS;
int ctt[1010][1010];
vector<int> ed[50010];
int rd[50010];queue<int> Q;int rea;
int nd[1010],tot,ded[1010],edt;
void dfs(int a)
{
	// printf("dfs(%d)",a);
	VS[a]=0;
	for(int k=(f[a]&VS)._Find_first();k<=tot;k=(f[a]&VS)._Find_first()) dfs(k);
	for(int k=(S[a]&VS)._Find_first();k<=tot;k=(S[a]&VS)._Find_first()) dfs(k);
}
int main()
{
	freopen("QOJ4000.in","r",stdin);
	freopen("QOJ4000.out","w",stdout);

	n=Qread(),m=Qread(),q=Qread();
	for(int i=1;i<=m;i++)
	{
		u[i]=Qread(),v[i]=Qread();
		l[++edge_cnt].nxt=p[u[i]],l[edge_cnt].poi=v[i];
		l[edge_cnt].typ=true,p[u[i]]=edge_cnt;
	}
	for(int i=1,cnt;i<=q;)
	{
		cnt=1,edt=0,tot=-1;
		for(;cnt<=B&&i<=q;cnt++,i++)
		{
			op[cnt]=Qread();
			if(op[cnt]==1)
			{
				qu[cnt]=Qread(),del[qu[cnt]]=true;
				nd[++tot]=u[i];nd[++tot]=v[i];
				ded[++edt]=qu[cnt];
			}
			else
			{
				qu[cnt]=Qread(),qv[cnt]=Qread();
				nd[++tot]=qu[cnt];nd[++tot]=qv[cnt];
			}
		}

		// printf("------\n");

		sort(nd,nd+tot+1);
		tot=unique(nd,nd+tot+1)-nd-1;
		
		//build DAG B
		memset(vis,0,sizeof(vis));
		memset(stk,0,sizeof(stk));
		ind=scc_cnt=0;
		for(int a=1;a<=n;a++) if(!vis[a]) Tarjan(a);

		// printf("------\n");

		// for(int a=1;a<=n;a++) cerr<<a<<"==="<<bel[a]<<endl;

		for(int i=1;i<=scc_cnt;i++) vector<int>().swap(ed[i]);
		for(int a=1;a<=n;a++) for(int k=p[a];k;k=l[k].nxt)
			if(l[k].typ&&!del[k]&&bel[a]!=bel[l[k].poi])
				ed[bel[l[k].poi]].push_back(bel[a]),rd[bel[a]]++;
		
		for(int i=1;i<=scc_cnt;i++) con[i].reset();
		for(int i=0;i<=tot;i++) con[bel[nd[i]]][i]=1;
		
		for(int i=1;i<=scc_cnt;i++) if(rd[i]==0) Q.push(i);
		while(!Q.empty())
		{
			rea=Q.front();Q.pop();
			for(int v:ed[rea])
			{
				// cerr<<rea<<"->"<<v<<endl;

				rd[v]--,con[v]|=con[rea];
				if(rd[v]==0) Q.push(v);
			}
		}

		for(int i=0;i<=tot;i++) f[i]=con[bel[nd[i]]];
		for(int i=1;i<=edt;i++)
		{
			if(l[ded[i]].typ&&del[ded[i]])
			{
				int tu=lower_bound(nd,nd+tot+1,u[ded[i]])-nd,tv=lower_bound(nd,nd+tot+1,v[ded[i]])-nd;
				S[tu][tv]=1,ctt[tu][tv]++;
			}
			del[ded[i]]=false;
		}
		
		// for(int i=0;i<=tot;i++)
		// {
		// 	cerr<<nd[i]<<" ";
		// 	for(int j=0;j<=tot;j++)
		// 		cerr<<f[i][j]<<" ";
		// 	cerr<<"|";
		// 	for(int j=0;j<=tot;j++)
		// 		cerr<<S[i][j]<<" ";
		// 	cerr<<endl;
		// }

		// printf("------\n");

		for(int i=1,tk;i<cnt;i++)
		{
			if(op[i]==1)
			{
				l[qu[i]].typ^=1;
				int tu=lower_bound(nd,nd+tot+1,u[qu[i]])-nd,tv=lower_bound(nd,nd+tot+1,v[qu[i]])-nd;
				
				// cerr<<i<<" "<<u[qu[i]]<<" "<<v[qu[i]]<<" "<<l[qu[i]].typ<<" "<<ctt[tu][tv]<<endl;
				
				if(l[qu[i]].typ)
				{
					ctt[tu][tv]++;
					S[tu][tv]=1;
				}
				else
				{
					ctt[tu][tv]--;
					if(ctt[tu][tv]==0)
						S[tu][tv]=0;
				}
			}
			else
			{
				// cerr<<i<<" "<<qu[i]<<" "<<qv[i]<<endl;
				// for(int k=0;k<=tot;k++)
				// {
				// 	cerr<<nd[k]<<" ";
				// 	for(int j=0;j<=tot;j++)
				// 		cerr<<f[k][j]<<" ";
				// 	cerr<<"|";
				// 	for(int j=0;j<=tot;j++)
				// 		cerr<<S[k][j]<<" ";
				// 	cerr<<endl;
				// }


				VS.set();

				// printf("%d %d\n",qu[i],qv[i]);

				dfs(lower_bound(nd,nd+tot+1,qu[i])-nd);
				tk=lower_bound(nd,nd+tot+1,qv[i])-nd;
				if(VS[tk]) printf("NO\n");
				else printf("YES\n");
			}
		}

		for(int i=1;i<=edt;i++) if(l[ded[i]].typ)
		{
			int tu=lower_bound(nd,nd+tot+1,u[ded[i]])-nd,tv=lower_bound(nd,nd+tot+1,v[ded[i]])-nd;
			S[tu][tv]=0,ctt[tu][tv]=0;
		}
	}

	
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Dangerous Syscalls

input:

5 6 7
1 2
1 3
2 4
3 4
3 5
4 5
2 1 5
2 2 3
1 3
1 4
2 1 4
1 3
2 1 5

output:


result: