hdu 1754 树状数组求最大值

  1. #include <stdio.h>
  2. #include <string>
  3. #define MAX(a,b) (a>b?a:b)
  4. #define Lowbit(x) (x & (-x))
  5. int idx[200010], num[200010];
  6. /*int Lowbit(int x)
  7. {
  8. return x&(-x);
  9. }*/
  10. /*int MAX(int x, int y)
  11. {
  12. return x > y ? x:y;
  13. }*/
  14. /*
  15. 对于区间 [l,r] 把该区间转化为多个的小区间再进行求最值,
  16. 方法是从后往前对每一个索引数的范围进行判断, 如在进行到第k项时,
  17. 该数控制的范围是 [k-Lowbit(k)+1,k], 如果k-Lowbit(k)+1在所求的范围内的话则将该区间的最值加入最值的判断,
  18. 然后转至地k-Lowbit(k),否则的话就只对第k个数进行最值判断,然后转至k-1
  19. */
  20. int Query(int l,int r)
  21. {
  22. int ans=num[r];
  23. while(true){
  24. ans=MAX(ans,num[r]);
  25. if(r==l) break;
  26. for(r-=1;r-l>=Lowbit(r);r-=Lowbit(r))
  27. {
  28. ans=MAX(ans,idx[r]);
  29. }
  30. }
  31. return ans;
  32. }
  33. /*约定以 num[] 表示原数组, 以 idx[] 表示索引数组, Lowbit(x)=x&(-x)
  34. 树状数组求和时通过构造数组 idx[] 使 idx[k]=sum(num[tk]), tk [k-Lowbit(k)+1,k], 使用同样的方法构造最值索引数组:
  35. 以最大值为例, 先讨论询问过程中不对数组做任何修改的情况, 用 idx[k] 记录 [k-Lowbit(k)+1,k] 区间内的最大值 */
  36. void Modify(int id,int grade,int n)
  37. {
  38. num[id] = grade;
  39. for(int i = id;i<=n;i+=Lowbit(i)){
  40. idx[i] = grade;
  41. for(int j=1;j<Lowbit(i);j<<=1){
  42. idx[i]=MAX(idx[i],idx[i-j]);
  43. }
  44. }
  45. }
  46. int main()
  47. {
  48. int n,m;
  49. while( scanf("%d %d", &n, &m)!=EOF )
  50. {
  51. memset(idx, 0, sizeof(idx) );
  52. memset(num, 0, sizeof(num) );
  53. for(int i=1; i<=n; i++) //i 为 id 即第几个人
  54. {
  55. scanf("%d", &num[i]);
  56. Modify(i, num[i], n); //一定要从1开始建立, 参数需建立数组, 为了改变idx
  57. }
  58. while(m--)
  59. {
  60. char str[3];
  61. int light, right;
  62. scanf("%s%d%d",str, &light, &right);
  63. if( str[0] == ‘Q‘ )
  64. printf("%d\n", Query(light, right) );
  65. else
  66. Modify(light, right, n); //这里代表更换的id的grade
  67. }
  68. }
  69. return 0;
  70. }
  71. /*
  72. 本题目包含多组测试,请处理到文件结束。
  73. 在每个测试的第一行,有两个正整数 N 和 M ( 0<N<=200000,0<M<5000 ),分别代表学生的数目和操作的数目。
  74. 学生ID编号分别从1编到N。
  75. 第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩。
  76. 接下来有M行。每一行有一个字符 C (只取‘Q‘或‘U‘) ,和两个正整数A,B。
  77. 当C为‘Q‘的时候,表示这是一条询问操作,它询问ID从A到B(包括A,B)的学生当中,成绩最高的是多少。
  78. 当C为‘U‘的时候,表示这是一条更新操作,要求把ID为A的学生的成绩更改为B。
  79. Output
  80. 对于每一次询问操作,在一行里面输出最高成绩。
  81. Sample Input
  82. 5 6
  83. 1 2 3 4 5
  84. Q 1 5
  85. U 3 6
  86. Q 3 4
  87. Q 4 5
  88. U 2 9
  89. Q 1 5
  90. Sample Output
  91. 5
  92. 6
  93. 5
  94. 9
  95. */

来自为知笔记(Wiz)

附件列表

时间: 2024-11-08 21:45:13

hdu 1754 树状数组求最大值的相关文章

HDU 1754 树状数组 解法

mnesia在频繁操作数据的过程可能会报错:** WARNING ** Mnesia is overloaded: {dump_log, write_threshold},可以看出,mnesia应该是过载了.这个警告在mnesia dump操作会发生这个问题,表类型为disc_only_copies .disc_copies都可能会发生. 如何重现这个问题,例子的场景是多个进程同时在不断地mnesia:dirty_write/2 mnesia过载分析 1.抛出警告是在mnesia 增加dump

树状数组求最大值 (RMQ with Shifts)

代码: #include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> using namespace std; const int Max=200010; int RMQ[Max+10]; int total[Max]; int sum[35]; int N,M,cnt; char ctr[35]; int bit(int x) {//每一个下标管辖的范围 ret

HDU 1394 树状数组求逆序对

Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 13036    Accepted Submission(s): 7968 Problem Description The inversion number of a given number sequence a1, a2, ..., an

HDU 1394 Minimum Inversion Number (树状数组求逆序数)

Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 13942    Accepted Submission(s): 8514 Problem Description The inversion number of a given number sequence a1, a2, ..., a

hdu 1394 Minimum Inversion Number (裸树状数组 求逆序数)

题目链接 题意: 给一个n个数的序列a1, a2, ..., an ,这些数的范围是0-n-1, 可以把前面m个数移动到后面去,形成新序列:a1, a2, ..., an-1, an (where m = 0 - the initial seqence)a2, a3, ..., an, a1 (where m = 1)a3, a4, ..., an, a1, a2 (where m = 2)...an, a1, a2, ..., an-1 (where m = n-1)求这些序列中,逆序数最少的

HDU 1394 Minimum Inversion Number (树状数组求逆序对)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题目让你求一个数组,这个数组可以不断把最前面的元素移到最后,让你求其中某个数组中的逆序对最小是多少. 一开始就求原来初始数组的逆序对,树状数组求或者归并方法求(可以看<挑战程序设计>P178),然后根据最前面的元素大小递推一下每次移到最后得到的逆序数,取最小值. 1 #include <iostream> 2 #include <cstdio> 3 #include

HDU 5249 离线树状数组求第k大+离散化

KPI Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1160    Accepted Submission(s): 488 Problem Description 你工作以后, KPI 就是你的全部了. 我开发了一个服务,取得了很大的知名度.数十亿的请求被推到一个大管道后同时服务从管头拉取请求.让我们来定义每个请求都有一个重要值.我的

hdu 5147 Sequence II (树状数组 求逆序数)

题目链接 Sequence II Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 331    Accepted Submission(s): 151 Problem Description Long long ago, there is a sequence A with length n. All numbers in this se

hdu 2985 The k-th Largest Group 树状数组求第K大

The k-th Largest Group Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 8353   Accepted: 2712 Description Newman likes playing with cats. He possesses lots of cats in his home. Because the number of cats is really huge, Newman wants to g