codeforces 707D-(DFS+bitset)
题目链接:http://codeforces.com/contest/707/problem/D
根据询问建立一棵树然后DFS。
#include<bits/stdc++.h> using namespace std; const int N=1e3+3; const int maxn=1e5+3; int n,m,q; vector<int> G[maxn]; bitset<N> bit[N]; bitset<N> opp; int ope[maxn],a[maxn],b[maxn],ans[maxn]; void dfs(int x) { if(ope[x]==1) { int flag=0; if(!bit[a[x]][b[x]]) { bit[a[x]][b[x]]=1; ans[x]++; flag=1; } for(int i=0;i<G[x].size();i++) { ans[G[x][i]]=ans[x]; dfs(G[x][i]); } if(flag) bit[a[x]][b[x]]=0; } else if(ope[x]==2) { int flag=0; if(bit[a[x]][b[x]]) { bit[a[x]][b[x]]=0; ans[x]--; flag=1; } for(int i=0;i<G[x].size();i++) { ans[G[x][i]]=ans[x]; dfs(G[x][i]); } if(flag) bit[a[x]][b[x]]=1; } else if(ope[x]==3) { ans[x]+=m-2*bit[a[x]].count(); bit[a[x]]^=opp; for(int i=0;i<G[x].size();i++) { ans[G[x][i]]=ans[x]; dfs(G[x][i]); } bit[a[x]]^=opp; } else { for(int i=0;i<G[x].size();i++) { ans[G[x][i]]=ans[x]; dfs(G[x][i]); } } } int main() { scanf("%d %d %d",&n,&m,&q); for(int i=1;i<=m;i++) opp[i]=1; for(int i=1;i<=q;i++) { scanf("%d",&ope[i]); if(ope[i]==1) { scanf("%d %d",a+i,b+i); G[i-1].push_back(i); } else if(ope[i]==2) { scanf("%d %d",a+i,b+i); G[i-1].push_back(i); } else if(ope[i]==3) { scanf("%d",a+i); G[i-1].push_back(i); } else { scanf("%d",a+i); G[a[i]].push_back(i); } } for(int i=0;i<G[0].size();i++) { ans[G[0][i]]=0; dfs(G[0][i]); } for(int i=1;i<=q;i++) printf("%d\n",ans[i]); return 0; }