题目大意
定义当两个三元组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 array
rep(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;
}