P2117 小Z的矩阵
Posted olinr
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P2117 小Z的矩阵相关的知识,希望对你有一定的参考价值。
题意:
给你一个初始01矩阵
三种操作
1、给一个x,把第x行01互换
2、给一个x,把第x列01互换
3、求$(sum_{i=1}^nsum_{j=1}^nf[i][j]*f[j][i])%2$
$nle 10^3,qle 5*10^5$
暴力是$O(n^2q)$的,很明显过不了
那么应该怎么做呢
不难看出$f[i][j]$在$i e j$的时候被算了两次!!!
如果f[i][j]*f[j][i]=1,那么就是(1+1)%2=2%2=0
如果f[i][j]*f[j][i]=0,那么就是(0+0)%2=0%2=0
卧槽,根本对答案无贡献啊
所以只用考虑对角线就行了
$O(q)$
#include<cstdio> #include<iostream> #include<cstring> #include<cctype> #include<algorithm> using namespace std; #define olinr return #define _ 0 #define love_nmr 0 #define DB double inline int read() { int x=0,f=1; char ch=getchar(); while(!isdigit(ch)) { if(ch==‘-‘) f=-f; ch=getchar(); } while(isdigit(ch)) { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return x*f; } inline void put(int x) { if(x<0) { x=-x; putchar(‘-‘); } if(x>9) put(x/10); putchar(x%10+‘0‘); } int n; int q; int ju[1050][1050]; int dui; int ans; int main() { n=read(); q=read(); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { ju[i][j]=read(); if(i==j) ans+=ju[i][j]; } ans%=2; for(int x,flag,i=1;i<=q;i++) { flag=read(); if(flag==1||flag==2) { x=read(); if(ju[x][x]) ans--; else ans++; ans=(ans+2)%2; } if(flag==3) { ans%=2; put(ans); } } olinr ~~(0^_^0)+love_nmr; }
以上是关于P2117 小Z的矩阵的主要内容,如果未能解决你的问题,请参考以下文章