1. 程式人生 > >洛谷—— P2117 小Z的矩陣

洛谷—— P2117 小Z的矩陣

發現 左右 clas ora www. stdout register 上一個 規模

https://www.luogu.org/problemnew/show/2117

題目描述

小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

以對角線為界,左右的乗起來加一遍,可以發現%2的結果都是0

更改時因為一定會有對角線上一個點更新,所以每次在0 1 之間變換就好了

 1 #include <cstdio>
 2 
 3 inline void read(int &x)
 4 {
 5     x=0; register char ch=getchar();
 6     for(; ch>9||ch<
0; ) ch=getchar(); 7 for(; ch>=0&&ch<=9; ch=getchar()) x=x*10+ch-0; 8 } 9 10 int n,q,ans; 11 12 int Presist() 13 { 14 // freopen("out.txt","w",stdout); 15 16 read(n),read(q); 17 for(int x,i=1; i<=n; ++i) 18 for(int j=1; j<=n; ++j) 19 { 20 read(x); 21 if(i==j&&x) ans=!ans; 22 } 23 for(int opt,x; q--; ) 24 { 25 read(opt); 26 if(opt==3) printf("%d",ans); 27 else read(x),ans=!ans; 28 } 29 return 0; 30 } 31 32 int Aptal=Presist(); 33 int main(int argc,char**argv){;}

洛谷—— P2117 小Z的矩陣