WUST 1255 巧克力(线段树的单点区间更新查询)

╰+哭是因爲堅強的太久メ 2022-06-11 09:58 291阅读 0赞

1355: 巧克力

Time Limit: 1 Sec Memory Limit: 128 MB 64bit IO Format: %lld
Submitted: 190 Accepted: 26
[ Submit][ Status][ Web Board]

Description

TY最喜欢做的事情就是吃巧克力,经常幻想拥有吃不完的巧克力,作为一个acmer(菜机),IcY出了个问题准备考考她,如果回答出来,那巧克力自然是源源不断的啦。

IcY给出了一列排好的的巧克力,有的是德芙,有的是费列罗,它们都拥有不同的美味值……现在IcY通过魔法更改了这些巧克力,TY必须能指出排列中第K个是巧克力的美味值是多少和某一段巧克力中最美味的值是多少,才能吃到巧克力,否则,哼哼,就去乖乖的做题吧。现在,TY来寻求你的帮助,你能让poor TY吃上巧克力吗?

Input

输入数据有很多组,以EOF结尾。

每组数据第一行是2个整数N,M。N代表初始的巧克力数目,M代表操作数。

第二行含有n个正整数,代表每块巧克力的美味值wi。每块巧克力的下标从0—n-1。

接下来的M行,表示M个操作。

操作分4种:

Query x y 代表查询某一个区间内的美味最大值。

Ask x 代表查询某一块巧克力的美味值。

Change x y 代表将第x块的美味值变成y

Add x y 代表讲从第x块到第y块巧克力的美味值分别增加1.

(1 <= N<= 1000001<= M <= 100000Wi <= 5000 )

Output

对于每一个Query输出一个整数,代表区间内的美味最大值。

对于每一个Ask 输出一个整数,代表这块巧克力的美味值。

" class="reference-link">Sample Input copy.gif

  1. 10 4
  2. 1 2 3 4 5 6 7 8 9 10
  3. Ask 0
  4. Change 0 1
  5. Add 0 2
  6. Query 0 2

#

Sample Output

  1. 1
  2. 4

[ Submit][ Status][ Web Board]

题解:

这是我们学校oj的一题,老赵看到很多人tle就让我做了,第一次数组开小了就TLE了,改了下就过了。。。考察的比较基础,还有就是要lazy tag不然会超时,对于经历过线段树专题的我这题还是很水的hhhhh,500ms过的

代码:

  1. #include<algorithm>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<stdio.h>
  5. #include<math.h>
  6. #include<string>
  7. #include<stdio.h>
  8. #include<queue>
  9. #include<stack>
  10. #include<map>
  11. #include<deque>
  12. #define M (t[k].l+t[k].r)/2
  13. #define lson k*2
  14. #define rson k*2+1
  15. using namespace std;
  16. struct node
  17. {
  18. int l,r;
  19. int maxx;//区间极值
  20. int tag;//延迟标记
  21. }t[100005*4];
  22. void pushup(int k)//区间合并,向上更新
  23. {
  24. t[k].maxx=max(t[lson].maxx,t[rson].maxx);
  25. }
  26. void Build(int l,int r,int k)//日常建树
  27. {
  28. t[k].l=l;
  29. t[k].r=r;
  30. t[k].tag=0;
  31. if(l==r)
  32. {
  33. scanf("%d",&t[k].maxx);
  34. return;
  35. }
  36. int mid=M;
  37. Build(l,mid,lson);
  38. Build(mid+1,r,rson);
  39. pushup(k);
  40. }
  41. void pushdown(int k)//向下更新
  42. {
  43. if(t[k].tag)
  44. {
  45. t[lson].maxx+=t[k].tag;
  46. t[rson].maxx+=t[k].tag;
  47. t[lson].tag+=t[k].tag;
  48. t[rson].tag+=t[k].tag;
  49. t[k].tag=0;
  50. }
  51. }
  52. void update1(int l,int r,int k,int v)//线段树的区间更新
  53. {
  54. if(t[k].l==l&&t[k].r==r)
  55. {
  56. t[k].maxx+=v;
  57. t[k].tag+=v;
  58. return;
  59. }
  60. pushdown(k);
  61. int mid=M;
  62. if(r<=mid)
  63. update1(l,r,lson,v);
  64. else if(l>mid)
  65. update1(l,r,rson,v);
  66. else
  67. {
  68. update1(l,mid,lson,v);
  69. update1(mid+1,r,rson,v);
  70. }
  71. pushup(k);
  72. }
  73. void update2(int x,int k,int v)//线段树的单点更新
  74. {
  75. if(t[k].l==t[k].r)
  76. {
  77. t[k].maxx=v;
  78. return;
  79. }
  80. pushdown(k);
  81. int mid=M;
  82. if(x<=mid)
  83. update2(x,lson,v);
  84. else
  85. update2(x,rson,v);
  86. pushup(k);
  87. }
  88. int query1(int l,int r,int k)//线段树的区间查询
  89. {
  90. if(t[k].l==l&&t[k].r==r)
  91. {
  92. return t[k].maxx;
  93. }
  94. pushdown(k);
  95. int mid=M;
  96. if(r<=mid)
  97. return query1(l,r,lson);
  98. else if(l>mid)
  99. return query1(l,r,rson);
  100. else
  101. {
  102. return max(query1(l,mid,lson),query1(mid+1,r,rson));
  103. }
  104. }
  105. int query2(int x,int k)//线段树的单点查询
  106. {
  107. if(t[k].l==t[k].r)
  108. {
  109. return t[k].maxx;
  110. }
  111. pushdown(k);
  112. int mid=M;
  113. if(x<=mid)
  114. return query2(x,lson);
  115. else
  116. return query2(x,rson);
  117. }
  118. int main()
  119. {
  120. int n,m,i,j,x,y,z;
  121. char s[10];
  122. while(scanf("%d%d",&n,&m)!=EOF)
  123. {
  124. Build(0,n-1,1);
  125. for(i=0;i<m;i++)
  126. {
  127. scanf("%s",s);//可以跳掉空格换行
  128. if(strcmp(s,"Ask")==0)
  129. {
  130. scanf("%d",&x);
  131. printf("%d\n",query2(x,1));
  132. }
  133. else if(strcmp(s,"Change")==0)
  134. {
  135. scanf("%d%d",&x,&y);
  136. update2(x,1,y);
  137. }
  138. else if(strcmp(s,"Add")==0)
  139. {
  140. scanf("%d%d",&x,&y);
  141. if(x>y)
  142. swap(x,y);
  143. update1(x,y,1,1);
  144. }
  145. else
  146. {
  147. scanf("%d%d",&x,&y);
  148. if(x>y)
  149. swap(x,y);
  150. printf("%d\n",query1(x,y,1));
  151. }
  152. }
  153. }
  154. return 0;
  155. }

发表评论

表情:
评论列表 (有 0 条评论,291人围观)

还没有评论,来说两句吧...

相关阅读