題源codeforces1974 problemC
題目大意
定義當兩個三元組A和B中,滿足三元組中有且僅有兩個元素相等,比如
a 1 = b 1 , a 2 = b 2 , a 3 ! = b 3 a_1=b_1,a_2=b_2,a_3!=b_3 a1?=b1?,a2?=b2?,a3?!=b3?
這只是一種情況,三種情況之一
解題思路
暴力。
挨個遍歷這個數組中的所有三元組,把這些三元組中前兩個元素/后兩個元素/兩邊兩個元素,用
map<pair<int,int>,int>
記錄下來,然后如果重復出現,就加上。
去重。
挨個遍歷這個數組中的所有三元組,把這些三元組全部用
map<tuple<int,int,int> ,int>
然后記錄下來所有重復出現的三元組,重復次數也記錄,便于去重。
詳情請看代碼
代碼
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define For for (int i = 1; i <= n; i++)
#define rFor for (int i = n; i > 0; i--)
#define rep(i, sta, end) for (int i = sta; i <= end; i++)
#define rrep(i, end, sta) for (int i = end; i >= sta; i--)
#define ALL(x) for (auto item : x)inline void solve() {int n;cin>>n;vector<int> arr(n+10);For cin>>arr[i];ll ans=0;map<pair<int,int> ,int> count_of_pair;//Iterate over all triples of the entire arrayrep(i,1,n-2)ans+=count_of_pair[{arr[i],arr[i+1]}]++;//cout<<ans<<endl;count_of_pair.clear();rep(i,1,n-2)ans+=count_of_pair[{arr[i+1],arr[i+2]}]++;//cout<<ans<<endl;count_of_pair.clear();rep(i,1,n-2)ans+=count_of_pair[{arr[i],arr[i+2]}]++;//cout<<ans<<endl;count_of_pair.clear();map<tuple<int,int,int>,int> count_of_triple;rep(i,1,n-2){ans-=3*count_of_triple[{arr[i],arr[i+1],arr[i+2]}]++;}//cout<<ans<<endl;cout<<max(ans,0LL)<<endl;//cout<<endl;
}int main() {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int num = 1;cin >> num;while (num--) {//cout << "Main function execute properly before solve function " << endl;solve();// cout << "Main function execute properly after solve function" << endl;}return 0;
}