社区讨论
贪心+并查集 58pts直接变苹果树,蒟蒻求助
P4698 [CEOI 2011] Hotel参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @m3wxh878
- 此快照首次捕获于
- 2024/11/25 19:11 去年
- 此快照最后确认于
- 2025/11/04 13:56 4 个月前
看过题解然后自己打的,调了好久一直调不出来
CPP#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
long long ans=0;
struct node1{
int c,p;
}h[500010];
struct node2{
int v,d;
}s[500010];
int cmp1(node1 x,node1 y){
if(x.p==y.p)return x.c>y.c;
return x.p>y.p;
}
int cmp2(node2 x,node2 y){
if(x.v==y.v)return x.d>y.d;
return x.v>y.v;
}
long long cmp(long long x,long long y){
return x>y;
}
int f[500010];
long long sly[500010];
int father(int id){
if(f[id]!=id)f[id]=father(f[id]);
return f[id];
}
int main(){
int n,m,o;
scanf("%d%d%d",&n,&m,&o);
for(int i=1;i<=n;i++){
scanf("%d%d",&h[i].c,&h[i].p);
}
sort(h+1,h+n+1,cmp1);
for(int i=1;i<=m;i++){
scanf("%d%d",&s[i].v,&s[i].d);
}
sort(s+1,s+m+1,cmp2);
for(int i=1;i<=n;i++)f[i]=i;
for(int i=1;i<=m;i++){
int l=1,r=n;
while(l!=r){
int mid=(l+r+1)/2;
if(h[mid].p>=s[i].d)l=mid;
else r=mid-1;
}
int u=father(l);
if(u==0)continue;
f[u]=u-1;
sly[u]=s[i].v-h[u].c;
}
sort(sly+1,sly+n+1,cmp);
for(int i=1;i<=o;i++){
if(sly[i]<=0)break;
ans+=sly[i];
}
printf("%lld",ans);
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...