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. JS 三个对话框

    <!DOCTYPE html><html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...

  2. Image Captioning 经典论文合辑

    Image Caption: Automatically describing the content of an image domain:CV+NLP Category:(by myself, y ...

  3. 人像美妆---妆容迁移算法研究(Makeup transfer)

    原文:人像美妆---妆容迁移算法研究(Makeup transfer) 对于人像美妆算法,现在的美妆相机.玩美彩妆之类的app已经做的比较成熟了,但是具体算法,基本网络上是杳无可查,今天本人介绍一种自 ...

  4. win10 uwp ApplicationView

    原文:win10 uwp ApplicationView 本文和大家介绍一个重要的类,他可以用来设置窗口,如设置启动大小,设置是否允许截图,是否进入全屏,所有和窗口有关的,都可以在他这里设置. 可以使 ...

  5. DDD中的值对象如何用NHibernate进行映射

    原文:DDD中的值对象如何用NHibernate进行映射 <component/>是NHibernate中一个有趣的特性,即是用来映射DDD(Data-Display-Debuger)概念 ...

  6. .NET框架中系列专业技术术语和缩写

    CIL (Common Intermediate Language) 公共中间语言 : CIL最初是随着.NET由微软一起发布的,之前也叫MSIL(Microsoft Intermediate Lan ...

  7. SQL Server 将某一列的值拼接成字符串

    名称 海鲜水产 水果蔬菜 海参 肉禽蛋 牛排 腊味 生鲜食品 将以上一列变成: 生鲜食品,海鲜水产,水果蔬菜,海参,牛排,肉禽蛋,腊味 sql for xml path('')

  8. QT5.6,5.7,5.8的新特征以及展望(Qt5.7首次正式支持Qt3D,以前都是预览版)

    https://wiki.qt.io/New_Features_in_Qt_5.6 (跨平台High-DPI,改进WebEngine到45,支持WIN 10,Canvas3D,3D) https:// ...

  9. 最短JS判断IE6/IE7/IE8系列的写法

    常用的 var isIE=!!window.ActiveXObject; var isIE6=isIE&&!window.XMLHttpRequest; var isIE8=isIE& ...

  10. delphi android 录像(使用了JMediaRecorder,MediaRecorder的使用方法可参考网上java的相关说明)

    delphi xe系列自带的控件都无法保存录像,经网友帮忙,昨天终于实现了录像功能(但有个问题是录像时无画面显示),程序主要使用了JMediaRecorder,MediaRecorder的使用方法可参 ...