CF Div. 3 C Beautiful Triple Pairs

lulaalu發表於2024-05-21

原題連結

標籤

組合數學(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]++;
}

就可以只遍歷一次陣列

相關文章