社区讨论

贪心+并查集 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 条回复,欢迎继续交流。

正在加载回复...