https://scut.online/p/130

130. 对抗女巫的魔法碎片

题目描述

光明世界的一个国家发生动荡,女巫利用了邪恶的力量将国家的村庄都施下了咒语,好在国家还有英勇的士兵,他们正义的力量能够破解这些魔咒夺回村庄,并且得到魔法碎片,利用足够多的魔法碎片可以将女巫铲除。

现在已经被魔咒封印的村庄有mm个,编号为11到mm。英勇的士兵nn个,编号从11到nn。第ii个士兵攻击力为a_ia​i​​,第jj个村庄防御力为b_jb​j​​,魔法价值为c_ic​i​​。

现在这些士兵想夺回这些村庄,每个士兵可以最多占领一个村庄,一个村庄最多被一个士兵占领。当士兵的攻击力a_ia​i​​大于村庄的防御力b_jb​j​​的时候,该士兵就可以夺回这个村庄,并且士兵会获得魔法碎片a_i - b_j + c_ja​i​​−b​j​​+c​j​​ 个。

现在想知道这些士兵夺回村庄,获得的魔法碎片之和最多是多少。

输入格式

输入第一行一个整数TT,表示有TT组数据。

接下来一行输入两个整数nn和mm。

接下来一行,输入nn个数 a_ia​i​​,表示士兵的攻击力。

接下来mm行,每行输入两个数b_i,c_ib​i​​,c​i​​,表示村庄的防御力和该村庄的魔法价值。

1 \leq n, m \leq 1000001≤n,m≤100000

1 \leq a_i, b_i, c_i \leq 1000001≤a​i​​,b​i​​,c​i​​≤100000

输出格式

一个整数,表示获得的魔法碎片的数量

样例数据

输入

2
3 3
4 4 4
2 3
1 3
5 3
3 3
4 4 6
2 3
4 3
5 3

输出

11
10 思路:贪心。首先因为能用更多的士兵去匹配更多的城堡更好,考虑如果当前有很多个士兵匹配一个城堡的情况,那么肯定是ai大的去匹配更好。
可以对a和b都从小到大排序,然后对于当前的士兵,将所有ai > bj的城堡都用cj - bj进入优先队列,然后对于这个士兵取堆顶,相当于当前士兵匹配堆顶这个城堡。
如果当前的士兵没找到城堡可以匹配,那么需要替换掉之前的士兵,即用更大的ai去匹配之前最小的ai对应的城堡,具体细节在代码中。
 #include <bits/stdc++.h>
using namespace std;
#define N 100010
typedef long long LL;
struct node {
int b, c;
} p[N];
int a[N], ans[N];
bool flag[N];
priority_queue<int> que; bool cmp(const node &a, const node &b) {
if(a.b != b.b) return a.b < b.b;
return a.c > b.c;
} int main() {
int t; scanf("%d", &t);
while(t--) {
int n, m; scanf("%d%d", &n, &m);
memset(ans, , sizeof(ans));
memset(flag, , sizeof(flag));
while(!que.empty()) que.pop();
for(int i = ; i <= n; i++) scanf("%d", &a[i]);
for(int i = ; i <= m; i++) scanf("%d %d", &p[i].b, &p[i].c);
sort(p + , p + + m, cmp);
sort(a + , a + + n);
int now = , cancel = ;
for(int i = ; i <= n; i++) {
while(a[i] > p[now].b && now <= m) que.push(p[now].c - p[now].b), now++;
if(!que.empty()) {
int top = que.top(); que.pop();
flag[i] = ; ans[i] = a[i] + top;
} else {
while(!flag[cancel] && cancel < i) cancel++;
if(flag[cancel]) ans[i] = ans[cancel] - a[cancel] + a[i], flag[i] = , flag[cancel] = , ans[cancel++] = ;
// printf("else : %d %d\n", i, cancel);
}
}
LL res = ;
for(int i = ; i <= n; i++) {
// printf("%d : %d\n", i, ans[i]);
if(flag[i]) res += ans[i] > ? ans[i] : ;
}
printf("%lld\n", res);
}
return ;
} /*
2
3 3
4 4 4
2 3
1 3
5 3
3 3
4 4 6
2 3
4 3
5 3
Êä³ö 11
10
*/

SCUT 130:对抗女巫的魔法碎片(贪心)的更多相关文章

  1. Luogu P3619 魔法 【贪心/微扰证明】

    题目描述 cjwssb知道是误会之后,跟你道了歉.你为了逗笑他,准备和他一起开始魔法.不过你的时间不多了,但是更惨的是你还需要完成n个魔法任务.假设你当前的时间为T,每个任务需要有一定的限制ti表示只 ...

  2. SCUT - 131 - 小P玩游戏II - 贪心 - 平衡树

    https://scut.online/p/131 首先假如钦定了一群人去打怪兽,那么可以把主要的任务都丢给b最大的人去打,这样不会更差.然后考虑枚举这个b最大的人,其他人陪练.一开始就是ai+k*b ...

  3. 2017杭电ACM集训队单人排位赛 - 6

    2017杭电ACM集训队单人排位赛 - 6 排名 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 59 1 X X 1 1 X X 0 1 ...

  4. [学习笔记]设计模式之Facade

    写在前面 为方便读者,本文已添加至索引: 设计模式 学习笔记索引 Facade(外观)模式定义了一个高层接口,它能为子系统中的一组接口提供一个一致的界面,从而使得这一子系统更加容易使用.欢迎回到时の魔 ...

  5. CodeForces758D

    D. Ability To Convert time limit per test:1 second memory limit per test:256 megabytes input:standar ...

  6. 玲珑杯1147 - 最后你还是AK了

    1147 - 最后你还是AK了 Time Limit:5s Memory Limit:256MByte DESCRIPTION 今天HHHH遇到了一颗树,这个树有nn个点(nn为偶数),每条边都有一个 ...

  7. ascii码所有字符对照表(包含汉字和外国文字)

    http://www.0xaa55.com/thread-398-1-1.html看到了0xaa55的这个帖子,想起了2年前我在51cto发的一个帖子http://down.51cto.com/dat ...

  8. ICPC Asia Nanning 2017 I. Rake It In (DFS+贪心 或 对抗搜索+Alpha-Beta剪枝)

    题目链接:Rake It In 比赛链接:ICPC Asia Nanning 2017 Description The designers have come up with a new simple ...

  9. 【BZOJ1975】【SDOI2010】魔法猪学院(搜索,A*,贪心)

    我已经沉迷于粘贴题目地址了... 题解 很显然的贪心呀, 就是一定是最短的若干条路径的长度 所以,不断拓展k短路就可以了 至于怎么用A* 评估函数f(x)=dis[x]+g[x] 其中,dis是到N号 ...

随机推荐

  1. Swift 中使用 SwiftyJSON 制作一个比特币价格 APP

    Swift 中处理 JSON 数据有很多种方式,可以使用原生的 NSJSONSerialization,也可以使用很多第三方库.原生的 NSJSONSerialization 方式这篇文章中介绍过.这 ...

  2. WPF编游戏系列 之六 动画效果(1)

    原文:WPF编游戏系列 之六 动画效果(1)        本篇主要针对界面进行动画效果处理.首先在打开或关闭界面时,使其产生动态效果而不是生硬的显示或消失(如下图).其次在鼠标放到关闭窗口图标上时, ...

  3. TCP 的那些事儿(上,下)

    http://coolshell.cn/articles/11564.html http://coolshell.cn/articles/11609.html

  4. C#获取带汉字的字符串长度

    正常情况下,我们是直接去string的length的,但是汉字是有两个字节的,所以直接用length是错的.如下图: 所以应该用以下代码来获取长度: private void button1_Clic ...

  5. SQLServer 订阅过期解决方法

    原文:SQLServer 订阅过期解决方法 由于分发数据库执行一个较长的事务,达到了系统预定的72小时,导致了该订阅过期,数据库分发代理已不可再启用,提示错误如下: 错误信息:已将此(这些)订阅标记为 ...

  6. GIS基础软件及操作(九)

    原文 GIS基础软件及操作(九) 练习九.水文分析 水文分析:根据DEM提取河流网络,计算流水累积量.流向.根据指定的流域面积大小自动划分流域 水文分分析工具 (1)通过Arctoolbox:水文分析 ...

  7. NULL指针区域(NULL定义为0-65535之间的任何数都可以)

    NULL指针区域0x00000000-0x0000FFFF:65535字节 这个区域的作用是用来帮助程序员发现内存分配失败后未检查就使用的错误.比如使用malloc分配内存失败,返回NULL,而又未做 ...

  8. 毕设(三)NotifyIcon

    NotifyIcon是一个比较特殊的组件,其特殊之处是既可以把它归类到控件中,也可以把它归类到组件中.这是因为将其拖放到设计窗体后,我们并不能马上看到它的界面(像组件),而是在运行时才能看到它(像控件 ...

  9. [机器学习]SVM原理

    SVM是机器学习中神一般的存在,虽然自深度学习以来有被拉下神坛的趋势,但不得不说SVM在这个领域有着举足轻重的地位.本文从Hard SVM 到 Dual Hard SVM再引进Kernel Trick ...

  10. 开源中国的 IT 公司开源软件整理计划介绍

    直击现场 <HTML开发MacOSApp教程>  http://pan.baidu.com/s/1jG1Q58M 开源中国的 IT 公司开源软件整理计划介绍 oschina 发布于: 20 ...