zoukankan      html  css  js  c++  java
  • 洛谷 P2117 小Z的矩阵

    题目描述

    小Z最近迷上了矩阵,他定义了一个对于一种特殊矩阵的特征函数G。对于N*N的矩阵A,A的所有元素均为0或1,则G(A)等于所有A[i][j]*A[j][i]的和对2取余之后的结果。举一个例子:

    对于上图这个3*3矩阵A,G(A)=(1*1+1*0+1*1+0*1+1*1+1*0+1*1+ 0*1+0*0) mod 2=0

    当然询问一个矩阵的G值实在是太简单了。小Z在给出一个N*N矩阵的同时将给你Q个操作,操作描述如下:

    操作1:形如一个整数1和一个整数x,表示将第x行的元素全部“翻转”。

    操作2:形如一个整数2和一个整数x,表示将第x列的元素全部“翻转”。

    操作3:形如一个整数3,表示询问当前矩阵的特征值G。

    “翻转”的定义为将1变成0,将0变成1。

    输入输出格式

    输入格式:

     

    第1行:两个正整数N,Q。 N表示矩阵的行数(列数),Q表示询问的个数。

    接下来N行:一个N*N的矩阵A,0<=A[i][j]<=1。

    接下来Q行:Q个操作。

     

    输出格式:

     

    一行若干个数,中间没有空格,分别表示每个操作的结果(操作1和操作2不需要输出)。

     

    输入输出样例

    输入样例#1: 复制
    3 12
    1 1 1
    0 1 1
    1 0 0
    3
    2 3
    3
    2 2
    2 2
    1 3
    3
    3
    1 2
    2 1
    1 1
    3
    输出样例#1: 复制
    01001

    说明

    【数据规模】

    30% N<=100, Q<=10^5

    100% N<=1,000, Q <=5*10^5

     思路:对于一个矩阵,将所有的a[i][j]*a[j][i]a[i][j]a[j][i]加起来后我们会发现,如果ii和jj不同的话,那么这个值将会对答案贡献两次,也就是说不管是00还是11,取膜之后

    一定是零,也就是对取膜之后的答案没有贡献。而如果ii和jj一样的话,当前答案只会被统计一次,因此其中的答案就是矩阵对角线的和取膜之后的值,如果对某一行某

    一列改变的话,一定会改变恰好一个对角线位置的值,因此答案一定会变化(11变00或00变11)。所以只需要开五个变量就能解决这道题了。

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n,m,ans;
    bool map[1010][1010];
    int main(){
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;++i)
            for(int j=1;j<=n;++j){
                int x;
                scanf("%d",&x);
                if(i==j&&x)    ans=!ans;
            }
        while(m--){
            int x,y;
            scanf("%d",&x);
            if(x == 1||x == 2) scanf("%d",&y),ans=!ans;
            else    printf("%d",ans);
        }
    }
    细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。 雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。
  • 相关阅读:
    webservice理解
    什么是xmlschema
    web项目中的跨域问题解决方法
    浏览器的同源策略和跨域问题
    java中Scanner和random的用法
    mybatis的批量删除
    java中的异常理解
    事务回滚
    做人做事2个字:心、眼
    Linux下找不到so文件的解决办法
  • 原文地址:https://www.cnblogs.com/cangT-Tlan/p/8017982.html
Copyright © 2011-2022 走看看