比赛 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;
}