HDU 3954 Level up

题目链接

题意:k个等级,n个英雄,每一个等级升级有一定经验,每次两种操作,一个区间加上val,这样区间内英雄都获得当前等级*val的经验,还有一个操作询问区间经验最大值

思路:由于等级少,所以每一个结点用Max[10]记录下每一个等级的最大值,假设有一个升级就一直找究竟,由于一个英雄升级最多10次,所以这个操作最多就10W次能够接受,剩下就是普通的区间改动区间查询的延迟操作了

代码:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5.  
  6. const int N = 10005;
  7. const int M = 11;
  8.  
  9. int t, n, k, qw, need[M];
  10.  
  11. #define lson(x) ((x<<1)+1)
  12. #define rson(x) ((x<<1)+2)
  13.  
  14. struct Node {
  15. int l, r, Max[M], add;
  16. bool cover;
  17. } node[N * 4];
  18.  
  19. void build(int l, int r, int x = 0) {
  20. node[x].l = l; node[x].r = r;
  21. memset(node[x].Max, -1, sizeof(node[x].Max));
  22. node[x].Max[1] = 0;
  23. node[x].add = 0;
  24. node[x].cover = false;
  25. if (l == r) return;
  26. int mid = (l + r) / 2;
  27. build(l, mid, lson(x));
  28. build(mid + 1, r, rson(x));
  29. }
  30.  
  31. bool judge(int x, int v) {
  32. for (int i = 1; i < k; i++) {
  33. if (node[x].Max[i] == -1) continue;
  34. if (node[x].Max[i] + i * v >= need[i + 1]) return true;
  35. }
  36. return false;
  37. }
  38.  
  39. void pushup(int x) {
  40. node[x].cover = (node[lson(x)].cover && node[rson(x)].cover);
  41. for (int i = 1; i <= k; i++)
  42. node[x].Max[i] = max(node[lson(x)].Max[i], node[rson(x)].Max[i]);
  43. }
  44.  
  45. void pushdown(int x) {
  46. if (node[x].add) {
  47. node[lson(x)].add += node[x].add;
  48. node[rson(x)].add += node[x].add;
  49. for (int i = 1; i <= k; i++) {
  50. if (node[lson(x)].Max[i] != -1)
  51. node[lson(x)].Max[i] += node[x].add * i;
  52. if (node[rson(x)].Max[i] != -1)
  53. node[rson(x)].Max[i] += node[x].add * i;
  54. }
  55. node[x].add = 0;
  56. }
  57. }
  58.  
  59. void add(int l, int r, int v, int x = 0) {
  60. if (node[x].l >= l && node[x].r <= r && (node[x].cover || !judge(x, v))) {
  61. node[x].add += v;
  62. for (int i = 1; i <= k; i++) {
  63. if (node[x].Max[i] == -1) continue;
  64. node[x].Max[i] += i * v;
  65. }
  66. return;
  67. }
  68. if (node[x].l == node[x].r) {
  69. int have;
  70. for (int i = 1; i < k; i++) {
  71. if (node[x].Max[i] != -1) {
  72. have = node[x].Max[i] + i * v;
  73. break;
  74. }
  75. }
  76. memset(node[x].Max, -1, sizeof(node[x].Max));
  77. for (int i = 2; i <= k; i++) {
  78. if (have < need[i]) {
  79. node[x].Max[i - 1] = have;
  80. return;
  81. }
  82. }
  83. node[x].Max[k] = have;
  84. node[x].cover = true;
  85. return;
  86. }
  87. int mid = (node[x].l + node[x].r) / 2;
  88. pushdown(x);
  89. if (l <= mid) add(l, r, v, lson(x));
  90. if (r > mid) add(l, r, v, rson(x));
  91. pushup(x);
  92. }
  93.  
  94. int query(int l, int r, int x = 0) {
  95. if (node[x].l >= l && node[x].r <= r) {
  96. for (int i = k; i >= 1; i--) {
  97. if (node[x].Max[i] == -1) continue;
  98. return node[x].Max[i];
  99. }
  100. }
  101. int mid = (node[x].l + node[x].r) / 2;
  102. int ans = 0;
  103. pushdown(x);
  104. if (l <= mid) ans = max(ans, query(l, r, lson(x)));
  105. if (r > mid) ans = max(ans, query(l, r, rson(x)));
  106. pushup(x);
  107. return ans;
  108. }
  109.  
  110. int main() {
  111. int cas = 0;
  112. scanf("%d", &t);
  113. while (t--) {
  114. printf("Case %d:\n", ++cas);
  115. scanf("%d%d%d", &n, &k, &qw);
  116. for (int i = 2; i <= k; i++)
  117. scanf("%d", &need[i]);
  118. build(1, n);
  119. char op[15];
  120. int a, b, c;
  121. while (qw--) {
  122. scanf("%s%d%d", op, &a, &b);
  123. if (op[0] == 'W') {
  124. scanf("%d", &c);
  125. add(a, b, c);
  126. } else printf("%d\n", query(a, b));
  127. }
  128. printf("\n");
  129. }
  130. return 0;
  131. }

HDU 3954 Level up(线段树)的更多相关文章

  1. hdu 3954 Level up(线段树)

    题目链接:hdu 3954 Level up 题目大意:N个英雄,M个等级,初始等级为1,给定每一个等级须要的经验值,Q次操作,操作分两种,W l r x:表示l~r之间的英雄每一个人杀了x个怪物:Q ...

  2. hdu 5700区间交(线段树)

    区间交 Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...

  3. Snacks HDU 5692 dfs序列+线段树

    Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...

  4. HDU 3954 Level up(多颗线段树+lazy操作)

    又是一开始觉得的水题,结果GG了好久的东西... 题意是给你n个英雄,每个英雄开始为1级经验为0,最多可以升到k级并且经验一直叠加,每一级都有一个经验值上限,达到就升级.接着给你两种操作:W li r ...

  5. HDU 4107 Gangster(线段树 特殊懒惰标记)

    两种做法. 第一种:标记区间最大值和最小值,若区间最小值>=P,则本区间+2c,若区间最大值<P,则本区间+c.非常简单的区间更新. 最后发一点牢骚:最后query查一遍就行,我这个2B竟 ...

  6. HDU 5091---Beam Cannon(线段树+扫描线)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5091 Problem Description Recently, the γ galaxies bro ...

  7. HDU 1542 Atlantis(线段树扫描线+离散化求面积的并)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  8. HDU 4031 Attack(线段树/树状数组区间更新单点查询+暴力)

    Attack Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) Total Sub ...

  9. HDU 5820 (可持久化线段树)

    Problem Lights (HDU 5820) 题目大意 在一个大小为50000*50000的矩形中,有n个路灯.(n<=500000) 询问是否每一对路灯之间存在一条道路,使得长度为|x1 ...

随机推荐

  1. 获取信息的有关Windows API(最有意思是OpenProcess和GetProcessMemoryInfo)

    1.窗口信息MS为我们提供了打开特定桌面和枚举桌面窗口的函数.hDesk = OpenDesktop(lpszDesktop, 0, FALSE, DESKTOP_ENUMERATE);// 打开我们 ...

  2. Jenkins: 使用Jenkins搭建持续集成(CI)环境

    http://www.cnitblog.com/luckydmz/archive/2012/01/03/77007.html 首先从官网http://jenkins-ci.org/下载 Java We ...

  3. Swift - 使用导航条和导航条控制器来进行页面切换

    通过使用导航条(UINavigationBar)与导航条控制器(UINavigationController)可以方便的在主页面和多层子页面之间切换.下面通过一个简单“组件效果演示”的小例子来说明如何 ...

  4. Ubuntu升级到14.04

    公司网络实在太翔了,搞了一天最终成功把ubuntu从13.10升级到了14.10,中间也越到了非常多问题,记录下来,以备參考. 13.10的时候想体验一把搜狗输入法,结果因为fcitx版本号太低,用了 ...

  5. CentOS7 下linux不能上网解决方法​,centos7 eth0 没有ip,IP突然丢失

    CentOS7 下linux不能上网解决方法​ 在CentOS VMware下安装好linux后,发现有时不能直接联网,特分享下总结出来的经验,希望对新手有用 工具/原料 XP系统 VMware.Wo ...

  6. Qt 4.7.4 完美动态编译发布动态调试,以及静态编译发布

    首先是准备工作,去QT主页下载独立的QT类库安装包以及完整QT SDK安装包,还有QT Creator for windows 版 下载地址:http://qt.nokia.com/downloads ...

  7. Shell编程中Shift的用法(转)

    位置参数可以用shift命令左移.比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1.$2.$3丢弃,$0不移动.不带参数的shift命令相当于shift 1. 非常 ...

  8. CSU 1506(最小费用最大流)

    传送门:Double Shortest Paths 题意:有两个人:给出路径之间第一个人走所需要的费用和第二个人走所需要的费用(在第一个人所需的 费用上再加上第二次的费用):求两个人一共所需要的最小费 ...

  9. blend

    看着各位大虾出系列文章貌似挺好玩的,本人耍了2个月的Wpf,有点见解,希望各位看官笑纳.本系列第一章就先来点简单又有用的吧o(∩_∩)o 哈哈.. 终于效果例如以下: ←点它 本人一直在做WPF算是第 ...

  10. IOS-UITextField-邮箱后缀联想赛

    最近做的项目,有一个函数,百度了一下 结果没 要研究了一下. 当用户输入邮箱形式的账号时,输入完"@"符号后.联想出经常使用的邮箱 点击某一行,将改行代表邮箱自己主动输入到账号输入 ...