线段树

又是熟悉的感觉,又是E题写完了,没调完,不过还好上了紫

CF1295E


可以发现可以打败怪兽的关系类似二维偏序

那么首先考虑第一维(武器)以攻击值($a_{i}$)进行排序

把所有的怪兽以防御力($x_{i}$)进行排序

然后用双指针维护到目前遍历到的武器,可以打败的怪兽

然后考虑防具和怪兽的攻击力也就是第二维

首先先定义$lb$数组,$lb[i]$表示所选防具至少为$i$的最少花费

可以用差分求出

可以发现如果选到防御力为$i$的防具,那么所有当前可以打败的怪兽中,只要攻击力小于$i$都可以累加到答案中

那么考虑$mx[i]$表示维护防御力最大为$i$的最大获利(包含防具的开支,武器的开支在最后计算)

对于一只新增的怪兽只要$i$大于其防御力,那么$mx[i]$都可以加上这只怪兽的获利

线段树维护即可

还要注意武器和防具里必选,不能不选

  1. 1 #include <bits/stdc++.h>
  2. 2 #define inf 1e18
  3. 3 #define int long long
  4. 4 using namespace std;
  5. 5 const int N=2*1e5+100,NUM=1e6+100;
  6. 6 int n,m,p,lb[NUM],ans,mb;
  7. 7 struct tool
  8. 8 {
  9. 9 int f,cost;
  10. 10 };
  11. 11 tool a[N],b[N];
  12. 12 struct monsters
  13. 13 {
  14. 14 int x,y,z;
  15. 15 }c[N];
  16. 16 struct node
  17. 17 {
  18. 18 int MAX,lazy;
  19. 19 }sh[NUM*4];
  20. 20 bool cmp(tool a,tool b)
  21. 21 {
  22. 22 return a.f<b.f;
  23. 23 }
  24. 24 bool cmp1(monsters a,monsters b)
  25. 25 {
  26. 26 return a.x<b.x;
  27. 27 }
  28. 28 void pushup(int x)
  29. 29 {
  30. 30 sh[x].MAX=max(sh[x+x].MAX,sh[x+x+1].MAX);
  31. 31 }
  32. 32 void pushdown(int x)
  33. 33 {
  34. 34 if (sh[x].lazy!=0)
  35. 35 {
  36. 36 sh[x+x].lazy+=sh[x].lazy;
  37. 37 sh[x+x+1].lazy+=sh[x].lazy;
  38. 38 sh[x+x].MAX+=sh[x].lazy;
  39. 39 sh[x+x+1].MAX+=sh[x].lazy;
  40. 40 sh[x].lazy=0;
  41. 41 }
  42. 42 }
  43. 43 void build(int x,int l,int r)
  44. 44 {
  45. 45 if (l==r)
  46. 46 {
  47. 47 sh[x].MAX=-lb[l];//处理当前防具的价格
  48. 48 return;
  49. 49 }
  50. 50 int mid=(l+r)>>1;
  51. 51 build(x+x,l,mid);
  52. 52 build(x+x+1,mid+1,r);
  53. 53 pushup(x);
  54. 54 }
  55. 55 void change(int x,int l,int r,int ll,int rr,int v)//区间修改
  56. 56 {
  57. 57 if (ll<=l && r<=rr)
  58. 58 {
  59. 59 sh[x].MAX+=v;
  60. 60 sh[x].lazy+=v;
  61. 61 return;
  62. 62 }
  63. 63 int mid=(l+r)>>1;
  64. 64 pushdown(x);
  65. 65 if (ll<=mid) change(x+x,l,mid,ll,rr,v);
  66. 66 if (rr>mid) change(x+x+1,mid+1,r,ll,rr,v);
  67. 67 pushup(x);
  68. 68 }
  69. 69 signed main()
  70. 70 {
  71. 71 scanf("%lld%lld%lld",&n,&m,&p);
  72. 72 for (int i=1;i<=n;i++) scanf("%lld%lld",&a[i].f,&a[i].cost);
  73. 73 for (int i=1;i<=m;i++) scanf("%lld%lld",&b[i].f,&b[i].cost);
  74. 74 for (int i=1;i<=p;i++) scanf("%lld%lld%lld",&c[i].x,&c[i].y,&c[i].z);
  75. 75 sort(a+1,a+1+n,cmp);
  76. 76 sort(c+1,c+1+p,cmp1);
  77. 77 for (int i=1;i<=m;i++) mb=max(mb,b[i].f);
  78. 78 for (int i=1;i<=mb;i++) lb[i]=inf;
  79. 79 for (int i=1;i<=m;i++) lb[b[i].f]=min(lb[b[i].f],b[i].cost);
  80. 80 for (int i=mb-1;i>=1;i--) lb[i]=min(lb[i+1],lb[i]);//差分求出lb数组
  81. 81 ans=-inf;
  82. 82 build(1,1,mb);
  83. 83 for (int i=1,j=1;i<=n;i++)
  84. 84 {
  85. 85 while (c[j].x<a[i].f && j<=p)//双指针维护当前可以击败的怪兽
  86. 86 {
  87. 87 if (c[j].y+1<=mb)//在防御力最大的防具之内
  88. 88 change(1,1,mb,c[j].y+1,mb,c[j].z);//要严格大于
  89. 89 j++;
  90. 90 }
  91. 91 ans=max(ans,-a[i].cost+sh[1].MAX);//最后计算武器的代价
  92. 92 }
  93. 93 printf("%lld\n",ans);
  94. 94 }

CF1320C World of Darkraft: Battle for Azathoth的更多相关文章

  1. Codeforces 1321E World of Darkraft: Battle for Azathoth

    题意 有\(n\)个武器,第\(i\)个武器攻击力为\(a_i\),价值\(ca_i\). 有\(m\)个防具,第\(i\)个防具防御力为\(b_i\),价值\(cb_i\). 有\(p\)个怪,第\ ...

  2. Codeforces Round #625 (1A - 1D)

      A - Journey Planning 题意: 有一列共 n 个城市, 每个城市有美丽值 b[i], 要访问一个子序列的城市, 这个子序列相邻项的原项数之差等于美丽值之差, 求最大的美丽值总和. ...

  3. Solution -「线段树」题目集合

    T1 无聊的数列 来自:Link flag 帖先从水题入手. 首先分析题目,它是以等差数列为原型进行的修改.等差数列一大性质就是其差分数列的值除第一项以外均相等. 于是不难想到使用差分数列进行维护. ...

  4. 【Virt.Contest】CF1321(div.2)

    第一次打虚拟赛. CF 传送门 T1:Contest for Robots 统计 \(r[i]=1\) 且 \(b[i]=0\) 的位数 \(t1\) 和 \(r[i]=0\) 且 \(b[i]=1\ ...

  5. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  6. Codeforces 738D. Sea Battle 模拟

    D. Sea Battle time limit per test: 1 second memory limit per test :256 megabytes input: standard inp ...

  7. 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 ...

  8. 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 ...

  9. 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 ...

随机推荐

  1. sqli-labs第三关 详解

    通过第二关,来到第三关 我们用了前两种方法,都报错,然后自己也不太会别的注入,然后莫名的小知识又增加了.这居然是一个带括号的字符型注入, 这里我们需要闭合前面的括号. $sql=select * fr ...

  2. 07 Sublime Text3常用快捷键

    通用常用类(General) ↑↓←→:上下左右移动光标,注意不是不是 KJHL ! Alt:调出菜单 Ctrl + Shift + P:调出命令板(Command Palette) Ctrl + ` ...

  3. 《VC++ 深入详解》 第3版 这是盗版书么~。。。

    <VC++ 深入详解> 第3版 www.broadview.com.cn 书读到一小半,发现书重复了一部分,缺失一部分.... 难受~ 比较难继续下去了 有一样的小伙伴么~ <VC+ ...

  4. opencv的imread函数相对路径问题和 main 参数问题

    参考: https://blog.csdn.net/u013404374/article/details/80178822 https://blog.csdn.net/fujilove/article ...

  5. Iptables 下 SNAT、DNAT和MASQUERADE三者之间的区别

    Iptables 中可以灵活的做各种网络地址转换(NAT,Network Address Translation) 网络地址转换(NAT)主要有两种:SNAT 和 DNAT,但是也有一种特例 MASQ ...

  6. Nuxt|Vue仿探探/陌陌卡片式滑动|vue仿Tinder拖拽翻牌效果

    探探/Tinder是一个很火的陌生人社交App,趁着国庆假期闲暇时间倒腾了个Nuxt.js项目,项目中有个模块模仿探探滑动切换界面效果.支持左右拖拽滑动like和no like及滑动回弹效果. 一览效 ...

  7. ansible-命令使用说明

    1. ansible命令的使用说明 ansible 主机或组-m 模块名-a '模块参数' ansible参数 表示调用什么模块,使用模块的那些参数 • 主机和组,是在/etc/ansible/hos ...

  8. mycat 全局表

    全局表的作用 在分片的情况下,当业务表因为规模而进行分片以后,业务表与这些附属的字典表之间的关联,就成了比较棘手的问题,考虑到字典表具有以下几个特性: 变动不频繁 数据量总体变化不大 数据规模不大,很 ...

  9. 多测师肖sir_pdf转word方法

    1.百度搜索 my love  pdf      在线转换 2.输入wps  下载软件

  10. day31 Pyhton 总结

    # 什么是封装?     # 广义上(大家认为的) :         # 把一类事务的相同的行为和属性归到一个类中 # class Dog: #     def bite(self):pass    ...