題目連線:
其實這道題跟行列式裡的分塊發有點類似,但也是類似罷了。
主要的思想是每一行,每一列的第一行(或者最後一行)空出,讓後根據下列算式:
行異或和:suma = a[1]^a[2]^a[3]...^a[n].
列異或和:sumb = b[1]^b[2]^b[3]...^b[m].
且本題的判斷為yes的充要條件是:suma = sumb
有異或和的演算法:x^a = b <==> x^b = a 知:
a[1]^a[2]^a[3] ... ^a[n-1] = a[n]^suma
b[1]^b[2]^b[3] ... ^b[m-1] = = b[m]^sumb
------------------------| ---x
比如這兩條線的交點為x 則要找到乙個x(a[n] = b[m])使他滿足:
x^a[1]^a[2]^a[3]^ ... ^a[n-1] = b[m] 且
x^b[1]^b[2]^b[3]^ ... ^ b[m-1] = a[n]
也就是 x^suma^a[n] = b[m],
故 x = suma^a[n]^b[m].
ac**以及步驟解釋如下:
#include #includeview code#include
using
namespace
std;
const
int mx = 100+10
;int
a[mx], b[mx];
intmp[mx][mx];
intmain()
for(int i = 1; i <= m; ++i)
if(suma != sumb) //
若行的總異或和不等於列的總異或和,則不成立
int x = suma^a[n]^b[m]; //
根據公式得到x
for(int i = 1; i <= n; ++i) mp[i][m] = a[i]; //
最後行,列進行初始化
for(int i = 1; i <= m; ++i) mp[n][i] =b[i];
mp[n][m] = x; //
賦值x printf("
yes\n");
for(int i = 1; i <= n; ++i) //
列印矩陣
}
Codeforces 703D 樹狀陣列
codeforces 703d 題意 給1e6長度的區間,每個單位代表乙個數。給1e6個詢問,每次問區間內出現次數為偶數次的數異或和。思路 賽中的時候想莫隊水過去,結果pretest都沒過233 正解是樹狀陣列。首先假設是奇數次的話,就是乙個簡單字首和。現在偶數次,有乙個處理技巧就是記錄這個區間出現...
codeforces 912D 期望計算
題目鏈結 題意 在乙個n m的魚塘裡面放置k條魚,每次可以選定乙個r r的矩陣並獲得矩陣內魚的數量的分數。請問該如何在魚塘裡面放置魚,使得最後的期望得分最大。思路 直接通過列舉放置魚的位置計算期望得分明顯非常非常不現實,於是我們換一種計算思路我們去計算各點放置魚之後可以得到的期望得分,然後取前k大的...
codeforces 523D 優先佇列
題意 給你n個任務單和k個機器,每個任務單有兩個變數開始的時間,完成所需要的時間,問你最優去做的話,每個訂單的結束時間是?題解 題目保證了資料是遞增排序的,那麼我們就不用sort了,直接做。然後這裡有個小套路 因為題目可以有k個機器,那我們可以先用k個0進去乙個優先佇列以達到模擬k個優先佇列的作用,...