jiangtaizhe001
2022-04-26 19:48:49
可能更好的阅读体验
在沙滩上有
现在你可以再数轴上任意一个位置(不需要为整数!)开一个冰淇淋商店,如果一个小屋到你开的冰淇淋店的距离比原有所以的冰淇淋点更加近,那么这个小屋里面所有的人都会到你开的冰淇淋店买冰淇淋。
注意可能存在冰淇淋店和小屋在同一位置,你开的冰淇淋店也可以和小屋在同一位置。
现在求到你开的冰淇淋店买冰淇淋的人的最大人数。
核心代码:
int n,m,dis[maxn],tmp; ll sum,ans;
struct JTZ{ int l,r,p; bool operator < (const JTZ x) const { return this->r<x.r; } }a[maxn];
int cmp(JTZ x,JTZ y){ return x.l<y.l; } multiset<JTZ> s;
#define dis(i) (((i)-1)*100)
int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
n=read(); m=read(); int i,j; for(i=1;i<=n;i++) a[i].p=read();
for(i=1;i<=m;i++) dis[i]=read(); sort(dis+1,dis+m+1);
j=1; for(i=1;i<=n;i++){
while(j<m&&mabs(dis[j]-dis(i))>mabs(dis[j+1]-dis(i))) j++;
tmp=mabs(dis[j]-dis(i)); a[i].l=dis(i)-tmp,a[i].r=dis(i)+tmp;
} sort(a+1,a+n+1,cmp); s.clear(); set<JTZ>::iterator it;
for(i=1;i<=n;i++) if(a[i].l<a[i].r){
if(!s.empty()){
it=s.begin();
while((*it).r<=a[i].l){
sum-=(*it).p; s.erase(it);
if(!s.empty()) it=s.cbegin(); else break;
}
} sum+=a[i].p; s.insert(a[i]); ans=mmax(ans,sum);
} print(ans); return 0;
}