zoukankan      html  css  js  c++  java
  • 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
    ",ans[i]);
        return 0;
    }
    



  • 相关阅读:
    集合容器概述
    enum枚举类型
    this关键字、this()、super()
    重载与重写
    nginx报404的可能错误
    nginx常用命令
    vbs系统监控
    VBS windows监控
    Oracle SQL优化[转]
    shell /bin/bash^M: bad interpreter错误解决
  • 原文地址:https://www.cnblogs.com/westwind1005/p/5975205.html
Copyright © 2011-2022 走看看