1. 程式人生 > >Codeforces Round #524 (Div. 2) C. Masha and two friends 思路

Codeforces Round #524 (Div. 2) C. Masha and two friends 思路

題目:題目連結

思路:直接計數顯然是不好處理的,但分情況討論只要不寫錯這題是一定可以出的,但這樣基本做完這個題就沒時間做其他題了,但當時我就這麼蠢的這樣做了,比賽一個半小時的時候突然發現一個似乎可行的規律,但因為時間問題沒有證,當時那個思路已經快寫完了也沒有換思路寫,就杯具了,最後那個寫了一坨的程式碼耗了我所有時間還錯到了第四組樣例。比賽結束用不到二十分鐘證明並寫出了那個規律的思路。最後賽後交題收穫一發AC。

  首先沒有塗色時白色和黑色數量我們可以直接算出,然後只考慮塗白色時,我們算這個區域內黑色方塊數量,更新白色和黑色方塊數量,然後只考慮塗黑色方塊,我們計算不考慮上次塗白色的情況下有多少白色被更新為黑色,最後考慮黑白重合的區域,對於這個區域,我們計算有多少最開始是黑色,然後被塗成白色,然後被塗成黑色並且沒有在上一步計數的方塊數量,這個區域座標為(max(x1, x3),max(y1, y3)),(min(x2, x4), min(y2, y4))。

  自己還是心態太差了,做題很容易緊張,尤其當時間很緊迫時,組隊賽甚至因為時間問題吼過隊友,,,回想自己在時間緊迫時太容易急躁了,不只是在比賽方面,生活各方面都是這樣,明知道急躁時沒用的還是很難改,這個題當時靜下來想一下當時是可以直接換思路過的,要改呀。

AC程式碼:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include 
<set> #include <map> #include <unordered_set> #include <unordered_map> #include <queue> #include <cmath> #include <set> #define INF 0x3f3f3f3f #define FRER() freopen("in.txt", "r", stdin); #define FREW() freopen("out.txt", "w", stdout); using namespace
std; int main() { //FRER(); int t; cin >> t; long long n, m, black, white, x1, y1, x2, y2, x3, y3, x4, y4; while(t--) { cin >> n >> m; cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3 >> x4 >> y4; black = n * m / 2; white = n * m - black; if((x1 + y1) & 1) { white += ((x2 - x1 + 1) * (y2 - y1 + 1) + 1) / 2; black -= ((x2 - x1 + 1) * (y2 - y1 + 1) + 1) / 2; } else { white += ((x2 - x1 + 1) * (y2 - y1 + 1)) / 2; black -= ((x2 - x1 + 1) * (y2 - y1 + 1)) / 2; } if((x3 + y3) & 1) { black += (x4 - x3 + 1) * (y4 - y3 + 1) / 2; white -= (x4 - x3 + 1) * (y4 - y3 + 1) / 2; } else { black += ((x4 - x3 + 1) * (y4 - y3 + 1) + 1) / 2; white -= ((x4 - x3 + 1) * (y4 - y3 + 1) + 1) / 2; } long long x5 = max(x1, x3), y5 = max(y1, y3), x6 = min(x2, x4), y6 = min(y2, y4); if(x6 >= x5 && y6 >= y5) { if((x5 + y5) & 1) { black += ((x6 - x5 + 1) * (y6 - y5 + 1) + 1) / 2; white -= ((x6 - x5 + 1) * (y6 - y5 + 1) + 1) / 2; } else { black += ((x6 - x5 + 1) * (y6 - y5 + 1)) / 2; white -= ((x6 - x5 + 1) * (y6 - y5 + 1)) / 2; } } cout << white << " " << black << endl; } return 0; }