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

浙公网安备 33010602011771号