C-two colors

题目链接:https://codeforces.com/contest/2075/problem/C

题意:

有n个格子m种颜料,给定每种颜料最多能涂多少格子的数组

求一种颜料占格子一边的涂法有多少种

思路:

易知a[i]最大为n-1

观察得到对于a[i]+a[j]>=n,方案种数为a[i]+a[j]+1-n种

那么排序+双指针(前指针从前往后遍历,后指针从后往前遍历且不倒退)+前缀和加速

void solve(){
    int n,m;cin>>n>>m;
    vector<int>a(m+1);
    rep(i,1,m){
        cin>>a[i];if(a[i]==n)a[i]-=1;
    }
    sort(a.begin()+1,a.end());
    vector<int>pre(m+1);
    rep(i,1,m){
        pre[i]=pre[i-1]+a[i];
    }
    int s=0;
    for(int l=1,r=m;l<=m;l++){
        while(r>1&&a[l]+a[r-1]>=n)r--;
        int tot=m-r+1;
        if(a[l]+a[r]>=n)s+=(a[l]+1-n)*tot+(pre[m]-pre[r-1]);
        if(a[l]+a[l]>=n){
            s-=(a[l]*2+1-n);
        }
    }
    cout<<s<<endl;
}
posted @ 2025-05-05 17:39  Marinaco  阅读(25)  评论(0)    收藏  举报
//雪花飘落效果