Loading

CF1271D Portals

CF1271D Portals

比较不错的一道反悔贪心题,当然也可以用DP。一般的反悔贪心都是堆+贪心。

思路

我们肯定想的是每个城市尽可能晚的控制,这样可以保留更多的兵去占领其他城市,因此我们仅让\(u\)于最晚能到达\(u\)的城市连边。然后莽正常的反悔贪心就好了,小根堆维护。

这么一说好像也不难欸。

代码

注意最后需要再次判断一下。

signed main()
{
	memset(h,-1,sizeof h);
	n = read();m = read();k = read();
	for(int i = 1;i <= n;i++){
		a[i] = read();
		b[i] = read();
		c[i] = read();
		mx[i] = i;
	}
	for(int i = 1;i <= m;i++){
		int u = read(),v = read();
		mx[v] = max(mx[v],u);
	}
	for(int i = 1;i <= n;i++) add(mx[i],i);
	for(int u = 1;u <= n;u++){
		while(k < a[u] && q.size()) q.pop(),k++;
		if(k < a[u]){
			puts("-1");
			return 0;
		}
		k += b[u];
		for(int i = h[u];~i;i = ne[i]){
			int j = e[i];
			q.push(c[j]);
			k--;
		}
	}
	while(k < 0 && q.size()) q.pop(),k++;
	while(q.size()) ans += q.top(),q.pop();
	printf("%lld\n",ans);
	return 0;
}
posted @ 2021-08-22 20:26  场-room  阅读(28)  评论(0)    收藏  举报