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;
}
艰难困苦,玉汝于成

浙公网安备 33010602011771号