| 比赛 |
NOIP2025模拟赛3 |
评测结果 |
AAAAAAAAAA |
| 题目名称 |
Good Triplets |
最终得分 |
100 |
| 用户昵称 |
梦那边的美好TE |
运行时间 |
0.985 s |
| 代码语言 |
C++ |
内存使用 |
11.32 MiB |
| 提交时间 |
2025-11-26 11:56:29 |
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=2e6+10;
typedef long long ll;
ll C(ll n,ll m){
if(m==3)return n*(n-1)*(n-2)/6;
if(m==2)return n*(n-1)/2;
if(m==1)return n;
}
ll ans;
int n,c,p[N],cnt[N],s[N];
int main(){
freopen("Triplets.in","r",stdin);
freopen("Triplets.out","w",stdout);
scanf("%d %d",&n,&c);
ans=C(n,3);
for(int i=1,x;i<=n;i++){
scanf("%d",p+i);
cnt[p[i]]++;
}
s[0]=cnt[0];
for(int i=1;i<c;i++){
s[i]=s[i-1]+cnt[i];
}
int L=c/2;
for(int i=0;i<c;i++){
if(!cnt[i])continue;
int sum=0;
if(i+L<c){
sum=s[i+L]-s[i];
}else if(i+L==c){
sum=n-s[i]+cnt[0];
}else{
sum=n-s[i];
sum+=s[i+L-c];
}
ans-=C(sum,2)*cnt[i];
if (c%2==0) ans-=C(cnt[i],2)*(sum-cnt[(i+L)%c]);
else ans-=C(cnt[i],2)*sum;
}
for(int i=0;i<c;i++){
if(cnt[i]>=3)ans-=C(cnt[i],3);
}
printf("%lld\n",ans);
return 0;
}