codeforces 707D-(DFS+bitset)

来源:互联网 发布:拜发试剂盒软件 编辑:程序博客网 时间:2024/05/16 11:43

题目链接: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;}


0 0
原创粉丝点击