zoukankan      html  css  js  c++  java
  • zjnu1707 TOPOVI (map+模拟)

    Description


    Mirko is a huge fan of chess and programming, but typical chess soon became boring for him, so he started having fun with rook pieces. He found a chessboard with N rows and N columns and placed K rooks on it. Mirko’s game is made of the following rules:


    1. Each rook’s power is determined by an integer.


    2. A rook sees all the fields that are in his row or column except its own field.


    3. We say that a field is attacked if the binary XOR of all the powers of the rooks that see the field is greater than 0.


    Notice that the field a rook is at can be attacked or not. Initially, Mirko placed the rooks in a certain layout on the board and will make P moves. After each move, determine how many fields are attacked. Every rook can be moved to any free field on the whole board (not only across column and row).


    Input


    The first line of input contains integers N, K, P (1 ≤ N ≤ 1 000 000 000, 1 ≤ K ≤ 100 000, 1 ≤ P ≤ 100 000). Each of the following K lines contains three integers R, C, X (1 ≤ R, C ≤ N, 1 ≤ X ≤ 1 000 000 000) which denote that initially there is a rook of power X on the field (R, C). Each of the following P lines contains four integers R1, C1, R2, C2 (1 ≤ R1, C1, R2, C2 ≤ N) which denote that the rook has moved from field (R1, C1) to field (R2, C2). It is guaranteed that there will not be two rooks on one field at any point.


    Output


    The output must consist of P lines, the k th line containing the total number of attacked fields after k moves.


    Sample Input




    2 2 2
    1 1 1
    2 2 1
    2 2 2 1
    1 1 1 2


    2 2 2
    1 1 1
    2 2 2
    2 2 2 1
    1 1 1 2


    3 3 4
    1 1 1
    2 2 2
    2 3 3
    2 3 3 3
    3 3 3 1
    1 1 1 2
    3 1 3 2
    Sample Output




    4
    0


    4
    2


    6
    7
    7

    题意:有n*n的矩阵,放了k只乌鸦,每一只乌鸦能看到和它所在位置同一行的和同一列的格子,除了它自己站的位置,有p次操作,每次操作把一只乌鸦从原来站的位置放到另外一个位置,问每次操作后被看到的次数的异或和不为0的格子总数。

    思路:用map记录第i行,第j列的异或值以及异或值为i的行,列的个数,然后每次移动一个子后,考虑失去这一格子对应的值value后对总的sum的影响,再考虑这一格子变成value^value后的值。


    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<math.h>
    #include<vector>
    #include<map>
    #include<set>
    #include<queue>
    #include<stack>
    #include<string>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    #define inf 600000
    #define maxn 100050
    ll sum;
    int n;
    map<int,int>rxor,cxor;  //rxor[i]=j map里第i行的异或值
    map<int,int>rcnt,ccnt; //rcnt[i]=j异或值为i的行的个数
    map<pair<int,int> ,int>mp;
    
    void remove(int r,int c,int value)
    {
        int i,j;
        sum-=n-ccnt[rxor[r] ];
        sum-=n-rcnt[cxor[c] ];
        if(rxor[r]!=cxor[c]){
            sum++;
        }
    
        rcnt[rxor[r] ]--;
        rxor[r]^=value;
        rcnt[rxor[r] ]++;
    
    
        ccnt[cxor[c] ]--;
        cxor[c]^=value;
        ccnt[cxor[c] ]++;
    
    
        sum+=n-ccnt[rxor[r] ];
        sum+=n-rcnt[cxor[c] ];
        if(rxor[r]!=cxor[c]){
            sum--;
        }
        mp[make_pair(r,c) ]^=value;
    }
    int main()
    {
        int m,i,j,k,p;
        int r1,r2,c1,c2,value;
        while(scanf("%d%d%d",&n,&k,&p)!=EOF)
        {
            rcnt[0]=ccnt[0]=n;
            for(i=1;i<=k;i++){
                scanf("%d%d%d",&r1,&c1,&value);
                remove(r1,c1,value);
            }
            for(i=1;i<=p;i++){
                scanf("%d%d%d%d",&r1,&c1,&r2,&c2);
                value=mp[make_pair(r1,c1)];
                remove(r1,c1,value);
                remove(r2,c2,value);
                printf("%lld
    ",sum);
            }
        }
        return 0;
    }
    


  • 相关阅读:
    1.1、Go快速入坟系列之循环与分支
    1.0、Go快速入坟系列之变量、常量与算术运算符
    0.0、Go快速入坟系列配置与安装Go环境
    使用Docker部署.Net Core项目
    留言板
    List实体中不同字段值的转换
    Yum安装,Linux自带Python卸载 安装
    CentOS7系统配置国内yum源和epel源
    Centos7安装jdk1.8
    VUE下载文件,下载后台返回的response
  • 原文地址:https://www.cnblogs.com/herumw/p/9464525.html
Copyright © 2011-2022 走看看