极差三元组计数 Problem Description
给定一个数组,请你计算有多少个三元组< i,j,k >满足0≤i,j,k
input
第一行输入一个正整数n。 第二行输入n个正整数aia_iai。
3≤n≤200000,1≤a≤1093≤n≤200000,1≤a≤10^93≤n≤200000,1≤a≤109ouput
一个整数,代表合法的三元组数量。
Sample Input 1
3
1 2 3Sample Output 1
0
Sample Input 2
4
2 1 2 2Sample Output 2
3
#include
#include
using namespace std;
int C_1(int t){return t;
}
int C_2(int t){return (t*(t-1))/2;
}
int main(){long long n;cin >> n;long long *a = new long long[n+5];for (long long i = 0; i < n; i++){cin >> a[i];}sort(a, a+n);long long *index = new long long[n+5];long long ni = 0, last_num = -1;for (int i = 0; i < n; i++){if (a[i] != last_num){index[ni++] = i;last_num = a[i];}}index[ni] = n;long long result = 0;for (long long i = 0; i < ni-1; i++){long long num = a[index[i]];long long next_num = a[index[i+1]];if (next_num-num != 1){continue;}long long count_num = index[i+1]-index[i];long long count_next_num = index[i+2]-index[i+1];if ((count_next_num + count_num < 3)||(count_num < 1)||(count_next_num < 1)){continue;}if (count_next_num > 1){result += C_1(count_num)*C_2(count_next_num);}if (count_num > 1){result += C_1(count_next_num)*C_2(count_num);}}cout << result;return 0;
}