CF1320C World of Darkraft: Battle for Azathoth
线段树
又是熟悉的感觉,又是E题写完了,没调完,不过还好上了紫
可以发现可以打败怪兽的关系类似二维偏序
那么首先考虑第一维(武器)以攻击值($a_{i}$)进行排序
把所有的怪兽以防御力($x_{i}$)进行排序
然后用双指针维护到目前遍历到的武器,可以打败的怪兽
然后考虑防具和怪兽的攻击力也就是第二维
首先先定义$lb$数组,$lb[i]$表示所选防具至少为$i$的最少花费
可以用差分求出
可以发现如果选到防御力为$i$的防具,那么所有当前可以打败的怪兽中,只要攻击力小于$i$都可以累加到答案中
那么考虑$mx[i]$表示维护防御力最大为$i$的最大获利(包含防具的开支,武器的开支在最后计算)
对于一只新增的怪兽只要$i$大于其防御力,那么$mx[i]$都可以加上这只怪兽的获利
线段树维护即可
还要注意武器和防具里必选,不能不选
- 1 #include <bits/stdc++.h>
- 2 #define inf 1e18
- 3 #define int long long
- 4 using namespace std;
- 5 const int N=2*1e5+100,NUM=1e6+100;
- 6 int n,m,p,lb[NUM],ans,mb;
- 7 struct tool
- 8 {
- 9 int f,cost;
- 10 };
- 11 tool a[N],b[N];
- 12 struct monsters
- 13 {
- 14 int x,y,z;
- 15 }c[N];
- 16 struct node
- 17 {
- 18 int MAX,lazy;
- 19 }sh[NUM*4];
- 20 bool cmp(tool a,tool b)
- 21 {
- 22 return a.f<b.f;
- 23 }
- 24 bool cmp1(monsters a,monsters b)
- 25 {
- 26 return a.x<b.x;
- 27 }
- 28 void pushup(int x)
- 29 {
- 30 sh[x].MAX=max(sh[x+x].MAX,sh[x+x+1].MAX);
- 31 }
- 32 void pushdown(int x)
- 33 {
- 34 if (sh[x].lazy!=0)
- 35 {
- 36 sh[x+x].lazy+=sh[x].lazy;
- 37 sh[x+x+1].lazy+=sh[x].lazy;
- 38 sh[x+x].MAX+=sh[x].lazy;
- 39 sh[x+x+1].MAX+=sh[x].lazy;
- 40 sh[x].lazy=0;
- 41 }
- 42 }
- 43 void build(int x,int l,int r)
- 44 {
- 45 if (l==r)
- 46 {
- 47 sh[x].MAX=-lb[l];//处理当前防具的价格
- 48 return;
- 49 }
- 50 int mid=(l+r)>>1;
- 51 build(x+x,l,mid);
- 52 build(x+x+1,mid+1,r);
- 53 pushup(x);
- 54 }
- 55 void change(int x,int l,int r,int ll,int rr,int v)//区间修改
- 56 {
- 57 if (ll<=l && r<=rr)
- 58 {
- 59 sh[x].MAX+=v;
- 60 sh[x].lazy+=v;
- 61 return;
- 62 }
- 63 int mid=(l+r)>>1;
- 64 pushdown(x);
- 65 if (ll<=mid) change(x+x,l,mid,ll,rr,v);
- 66 if (rr>mid) change(x+x+1,mid+1,r,ll,rr,v);
- 67 pushup(x);
- 68 }
- 69 signed main()
- 70 {
- 71 scanf("%lld%lld%lld",&n,&m,&p);
- 72 for (int i=1;i<=n;i++) scanf("%lld%lld",&a[i].f,&a[i].cost);
- 73 for (int i=1;i<=m;i++) scanf("%lld%lld",&b[i].f,&b[i].cost);
- 74 for (int i=1;i<=p;i++) scanf("%lld%lld%lld",&c[i].x,&c[i].y,&c[i].z);
- 75 sort(a+1,a+1+n,cmp);
- 76 sort(c+1,c+1+p,cmp1);
- 77 for (int i=1;i<=m;i++) mb=max(mb,b[i].f);
- 78 for (int i=1;i<=mb;i++) lb[i]=inf;
- 79 for (int i=1;i<=m;i++) lb[b[i].f]=min(lb[b[i].f],b[i].cost);
- 80 for (int i=mb-1;i>=1;i--) lb[i]=min(lb[i+1],lb[i]);//差分求出lb数组
- 81 ans=-inf;
- 82 build(1,1,mb);
- 83 for (int i=1,j=1;i<=n;i++)
- 84 {
- 85 while (c[j].x<a[i].f && j<=p)//双指针维护当前可以击败的怪兽
- 86 {
- 87 if (c[j].y+1<=mb)//在防御力最大的防具之内
- 88 change(1,1,mb,c[j].y+1,mb,c[j].z);//要严格大于
- 89 j++;
- 90 }
- 91 ans=max(ans,-a[i].cost+sh[1].MAX);//最后计算武器的代价
- 92 }
- 93 printf("%lld\n",ans);
- 94 }
CF1320C World of Darkraft: Battle for Azathoth的更多相关文章
- Codeforces 1321E World of Darkraft: Battle for Azathoth
题意 有\(n\)个武器,第\(i\)个武器攻击力为\(a_i\),价值\(ca_i\). 有\(m\)个防具,第\(i\)个防具防御力为\(b_i\),价值\(cb_i\). 有\(p\)个怪,第\ ...
- Codeforces Round #625 (1A - 1D)
A - Journey Planning 题意: 有一列共 n 个城市, 每个城市有美丽值 b[i], 要访问一个子序列的城市, 这个子序列相邻项的原项数之差等于美丽值之差, 求最大的美丽值总和. ...
- Solution -「线段树」题目集合
T1 无聊的数列 来自:Link flag 帖先从水题入手. 首先分析题目,它是以等差数列为原型进行的修改.等差数列一大性质就是其差分数列的值除第一项以外均相等. 于是不难想到使用差分数列进行维护. ...
- 【Virt.Contest】CF1321(div.2)
第一次打虚拟赛. CF 传送门 T1:Contest for Robots 统计 \(r[i]=1\) 且 \(b[i]=0\) 的位数 \(t1\) 和 \(r[i]=0\) 且 \(b[i]=1\ ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- Codeforces 738D. Sea Battle 模拟
D. Sea Battle time limit per test: 1 second memory limit per test :256 megabytes input: standard inp ...
- Codeforces #380 div2 D(729D) Sea Battle
D. Sea Battle time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- The 2015 China Collegiate Programming Contest C. The Battle of Chibi hdu 5542
The Battle of Chibi Time Limit: 6000/4000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Othe ...
- get a new level 25 battle pet in about an hour
If you have 2 level 25 pets and any level 1 pet, obviously start with him in your lineup. Defeat all ...
随机推荐
- sqli-labs第三关 详解
通过第二关,来到第三关 我们用了前两种方法,都报错,然后自己也不太会别的注入,然后莫名的小知识又增加了.这居然是一个带括号的字符型注入, 这里我们需要闭合前面的括号. $sql=select * fr ...
- 07 Sublime Text3常用快捷键
通用常用类(General) ↑↓←→:上下左右移动光标,注意不是不是 KJHL ! Alt:调出菜单 Ctrl + Shift + P:调出命令板(Command Palette) Ctrl + ` ...
- 《VC++ 深入详解》 第3版 这是盗版书么~。。。
<VC++ 深入详解> 第3版 www.broadview.com.cn 书读到一小半,发现书重复了一部分,缺失一部分.... 难受~ 比较难继续下去了 有一样的小伙伴么~ <VC+ ...
- opencv的imread函数相对路径问题和 main 参数问题
参考: https://blog.csdn.net/u013404374/article/details/80178822 https://blog.csdn.net/fujilove/article ...
- Iptables 下 SNAT、DNAT和MASQUERADE三者之间的区别
Iptables 中可以灵活的做各种网络地址转换(NAT,Network Address Translation) 网络地址转换(NAT)主要有两种:SNAT 和 DNAT,但是也有一种特例 MASQ ...
- Nuxt|Vue仿探探/陌陌卡片式滑动|vue仿Tinder拖拽翻牌效果
探探/Tinder是一个很火的陌生人社交App,趁着国庆假期闲暇时间倒腾了个Nuxt.js项目,项目中有个模块模仿探探滑动切换界面效果.支持左右拖拽滑动like和no like及滑动回弹效果. 一览效 ...
- ansible-命令使用说明
1. ansible命令的使用说明 ansible 主机或组-m 模块名-a '模块参数' ansible参数 表示调用什么模块,使用模块的那些参数 • 主机和组,是在/etc/ansible/hos ...
- mycat 全局表
全局表的作用 在分片的情况下,当业务表因为规模而进行分片以后,业务表与这些附属的字典表之间的关联,就成了比较棘手的问题,考虑到字典表具有以下几个特性: 变动不频繁 数据量总体变化不大 数据规模不大,很 ...
- 多测师肖sir_pdf转word方法
1.百度搜索 my love pdf 在线转换 2.输入wps 下载软件
- day31 Pyhton 总结
# 什么是封装? # 广义上(大家认为的) : # 把一类事务的相同的行为和属性归到一个类中 # class Dog: # def bite(self):pass ...