原題連結
標籤
組合數學(combinatorics)
資料結構(data structures)
題目大意
一個陣列 \(a\) 。對於每個 \(j\) ( \(1 \le j \le n - 2\) ) 寫出一個由 \([a_j, a_{j + 1}, a_{j + 2}]\) 組成的三元組。
滿足以下條件之一,那麼這對三元組就是美麗的:
- \(b_1 \ne c_1\) 和 \(b_2 = c_2\) 以及 \(b_3 = c_3\) ;
- \(b_1 = c_1\) 和 \(b_2 \ne c_2\) 和 \(b_3 = c_3\) ;
- \(b_1 = c_1\) 和 \(b_2 = c_2\) 和 \(b_3 \ne c_3\) 。
求書寫的三元組 \([a_j, a_{j + 1}, a_{j + 2}]\) 中優美的三元組對數。
思路
為保證每次只遍歷一次,將每次遇到的三元組\([a_j, a_{j + 1}, a_{j + 2}]\) 處理為三小組
\([0, a_{j + 1}, a_{j + 2}]\)
\([a_j, 0 , a_{j + 2}]\)
\([a_j, a_{j + 1}, 0]\)
存入map中,儲存次數,再將原三元組存入map中
每次查詢當前小組的次數,減去匹配到的原組次數
map<tuple<int, int, int>, int>mp;
int res = 0;
rep(ii, 0, n - 2) {
tuple<int, int, int>t1 = { 0 ,arr[ii + 1] , arr[ii + 2] };
tuple<int, int, int>t2 = { arr[ii] , 0 , arr[ii + 2] };
tuple<int, int, int>t3 = { arr[ii] , arr[ii + 1] , 0 };
tuple<int, int, int>t = { arr[ii] , arr[ii + 1] , arr[ii + 2] };
res += mp[t1]++ - mp[t];
res += mp[t2]++ - mp[t];
res += mp[t3]++ - mp[t];
mp[t]++;
}
就可以只遍歷一次陣列