链接:

https://codeforces.com/contest/1271/problem/D

题意:

You play a strategic video game (yeah, we ran out of good problem legends). In this game you control a large army, and your goal is to conquer n castles of your opponent.

Let's describe the game process in detail. Initially you control an army of k warriors. Your enemy controls n castles; to conquer the i-th castle, you need at least ai warriors (you are so good at this game that you don't lose any warriors while taking over a castle, so your army stays the same after the fight). After you take control over a castle, you recruit new warriors into your army — formally, after you capture the i-th castle, bi warriors join your army. Furthermore, after capturing a castle (or later) you can defend it: if you leave at least one warrior in a castle, this castle is considered defended. Each castle has an importance parameter ci, and your total score is the sum of importance values over all defended castles. There are two ways to defend a castle:

if you are currently in the castle i, you may leave one warrior to defend castle i;

there are m one-way portals connecting the castles. Each portal is characterised by two numbers of castles u and v (for each portal holds u>v). A portal can be used as follows: if you are currently in the castle u, you may send one warrior to defend castle v.

Obviously, when you order your warrior to defend some castle, he leaves your army.

You capture the castles in fixed order: you have to capture the first one, then the second one, and so on. After you capture the castle i (but only before capturing castle i+1) you may recruit new warriors from castle i, leave a warrior to defend castle i, and use any number of portals leading from castle i to other castles having smaller numbers. As soon as you capture the next castle, these actions for castle i won't be available to you.

If, during some moment in the game, you don't have enough warriors to capture the next castle, you lose. Your goal is to maximize the sum of importance values over all defended castles (note that you may hire new warriors in the last castle, defend it and use portals leading from it even after you capture it — your score will be calculated afterwards).

Can you determine an optimal strategy of capturing and defending the castles?

思路:

计算到每个城堡最少多少人,计算出每个位置可以派出去多少人。

记录每个点最右边的坐标,因为左边的人可以带到右边去用,所以往右边放是较优的。

这样就可以用一个堆来维护。

代码:

#include<bits/stdc++.h>
using namespace std; const int MAXN = 5e3+10; struct Node
{
int v, i;
bool operator < (const Node & rhs) const
{
return this->v < rhs.v;
}
}; priority_queue<Node> que;
int a[MAXN], b[MAXN], c[MAXN];
int need[MAXN], las[MAXN], use[MAXN];
int n, m, k; int main()
{
cin >> n >> m >> k;
for (int i = 1;i <= n;i++)
cin >> a[i] >> b[i] >> c[i], las[i] = i;
int u, v;
for (int i = 1;i <= m;i++)
{
cin >> u >> v;
las[v] = max(las[v], u);
}
need[n] = a[n];
for (int i = n-1;i >= 1;i--)
need[i] = max(a[i], need[i+1]-b[i]);
int sum = k;
for (int i = 1;i <= n;i++)
{
if (sum < a[i])
{
puts("-1");
return 0;
}
sum += b[i];
}
sum = k;
for (int i = 1;i <= n;i++)
{
use[i] = sum+b[i]-need[i+1];
sum = need[i+1];
que.push(Node{c[i], i});
}
int ans = 0;
while(!que.empty())
{
int val = que.top().v;
int x = que.top().i;
que.pop();
int y = las[x];
while(use[y] == 0 && y > 0)
y--;
if (y == 0)
continue;
use[y]--;
ans += val;
}
cout << ans << endl; return 0;
}

Codeforces Round #608 (Div. 2) D. Portals的更多相关文章

  1. Codeforces Round #608 (Div. 2) - D. Portals(贪心)

    题意:你起初有一支军队,有$k$个士兵,现在有$n$座城堡,你若想占领第$i$座城堡,至少得有$a[i]$个士兵才能占领$($占领后士兵不会减少$)$,占领了第$i$座城堡后,你将得到$b[i]$个士 ...

  2. Codeforces Round #608 (Div. 2) 题解

    目录 Codeforces Round #608 (Div. 2) 题解 前言 A. Suits 题意 做法 程序 B. Blocks 题意 做法 程序 C. Shawarma Tent 题意 做法 ...

  3. Codeforces Round #608 (Div. 2)

    传送门 A. Suits 签到. Code /* * Author: heyuhhh * Created Time: 2019/12/15 17:16:33 */ #include <iostr ...

  4. 【cf补题记录】Codeforces Round #608 (Div. 2)

    比赛传送门 再次改下写博客的格式,以锻炼自己码字能力 A. Suits 题意:有四种材料,第一套西装需要 \(a\).\(d\) 各一件,卖 \(e\) 块:第二套西装需要 \(b\).\(c\).\ ...

  5. Codeforces Round #608 (Div. 2) E. Common Number

    链接: https://codeforces.com/contest/1271/problem/E 题意: At first, let's define function f(x) as follow ...

  6. Codeforces Round #608 (Div. 2) E - Common Number (二分 思维 树结构)

  7. Codeforces Round #608 (Div. 2)D(贪心)

    #define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using namespace std; ],b[],c[]; int u,v; ...

  8. Codeforces Round #608 (Div. 2) E. Common Number (二分,构造)

    题意:对于一个数\(x\),有函数\(f(x)\),如果它是偶数,则\(x/=2\),否则\(x-=1\),不断重复这个过程,直到\(x-1\),我们记\(x\)到\(1\)的这个过程为\(path( ...

  9. Codeforces Round #564 (Div. 1)

    Codeforces Round #564 (Div. 1) A Nauuo and Cards 首先如果牌库中最后的牌是\(1,2,\cdots, k\),那么就模拟一下能不能每次打出第\(k+i\ ...

随机推荐

  1. 【Python开发】urllib2异常处理

    一.urllib2模块回顾 urllib2模块中最重要的函数是urlopen()函数,用于获取URLs资源(Uniform Resorce Locators).urlopen函数不仅可以用于简单的情况 ...

  2. VMware重装:网络适配器驱动安装失败解决办法

    参考链接:https://blog.csdn.net/theConqueror/article/details/80449125

  3. 影响mysql主从延迟速度的相关参数

    1.sync-binlog MySQL提供一个sync_binlog参数来控制数据库的binlog刷到磁盘上去. 默认,sync_binlog=0,表示MySQL不控制binlog的刷新,由文件系统自 ...

  4. IIS写权限漏洞和XFF刷票原理

    IIS写权限漏洞 PUT写入漏洞 此漏洞主要是因为服务器开启了webdav的组件导致的 1.扫描漏洞,yes,可以PUT: 2.用老兵的工具上传一句话文件test.txt,然后move改名为shell ...

  5. [转帖]Windows 下如何配置Oracle ASM???

    Windows 下如何配置Oracle ASM??? candon123关注10人评论16725人阅读2011-02-09 21:40:57   本篇介绍了如何在windows下创建裸设备,并创建AS ...

  6. 什么是云数据库 HBase 版

    云数据库 HBase 版(ApsaraDB for HBase)是基于 Hadoop 的一个分布式数据库,支持海量的PB级的大数据存储,适用于高吞吐的随机读写的场景.目前在阿里内部有数百个集群,100 ...

  7. Zabbix 系统概述与部署

    Zabbix是一个非常强大的监控系统,是企业级的软件,来监控IT基础设施的可用性和性能.它是一个能够快速搭建起来的开源的监控系统,Zabbix能监视各种网络参数,保证服务器系统的安全运营,并提供灵活的 ...

  8. Codeforces 1201C. Maximum Median

    传送门 看到中位数考虑先把数排序一下 然后有个显然的贪心,一个数增加后一定不能比下一个数大,不然我们直接增加下一个数显然更优 所以初始时的中位数操作后也是中位数 那么我们只要考虑中间再往后怎么加使得答 ...

  9. JS基础_强制类型转换-String

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. [转载]ubuntu常用命令

    1.帮助      --help简单的帮助      help command 较详细的帮助      man command 最详细的帮助2.ls 命令      ls -a 显示全部的文件及文件夹 ...