社区讨论
abc_d 玄关求条
学术版参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mhj02hy4
- 此快照首次捕获于
- 2025/11/03 18:31 4 个月前
- 此快照最后确认于
- 2025/11/03 18:31 4 个月前
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+5;
int n,m,c,len,a[N],d[N],ans;
map<int,bool> mp;
vector<int> v;
signed main(){
cin>>n>>m>>c;
for(int i=1;i<=n;i++){
cin>>a[i];
if(!mp[a[i]]){
v.push_back(a[i]);
mp[a[i]]=1;
}
}
len=v.size();
sort(v.begin(),v.end());
for(int i=1;i<=n;i++){
int x=upper_bound(v.begin(),v.end(),a[i])-v.begin()-1;
d[x]++;
}
for(int i=1;i<len;i++){
d[i]+=d[i-1];
}
int now=-1;
for(int i=0;i<len;i++){
if(d[len-1]-d[i]>=c){
int l=i+1,r=len-1,sum=0;
while(l<=r){
int mid=(l+r)/2;
if(d[mid]-d[i]>=c){
sum=d[mid]-d[i];
r=mid-1;
}
else{
l=mid+1;
}
}
int t=v[i]-now;
ans+=t*sum;
//cout<<t<<" "<<sum<<endl;
}
else{
int x=d[len-1]-d[i];
int l=0,r=i,sum=0;
while(l<=r){
int mid=(l+r)/2;
if(d[mid]>=c-x){
sum=x+d[mid];
r=mid-1;
}
else{
l=mid+1;
}
}
int t=v[i]-now;
ans+=t*sum;
//cout<<t<<" "<<sum<<endl;
}
now=v[i];
}
if(now==m-1){
cout<<ans;
return 0;
}
int l=0,r=len-1,sum=0;
while(l<=r){
int mid=(l+r)/2;
if(d[mid]>=c){
sum=d[mid];
r=mid-1;
}
else{
l=mid+1;
}
}
int t=m-1-now;
ans+=t*sum;
//cout<<t<<" "<<sum<<endl;
cout<<ans;
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...