QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#392727 | #4000. Dynamic Reachability | Xun_xiaoyao | RE | 0ms | 0kb | C++14 | 4.5kb | 2024-04-17 19:57:09 | 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