一開始度错题了,题意是求一段和最大的【子序列】,要求相邻两个元素的位置必须互为奇偶。

这样我们能够使用线段树维护4个值:

一段区间内开头结尾元素为:

奇奇

奇偶

偶奇

偶偶

的最大值

之后在pushup的的时候依据题目所给的意思进行合并。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. #define lson (pos<<1)
  6. #define rson (pos<<1|1)
  7. typedef long long LL;
  8. const int maxn = 100005;
  9. const LL INF = 9999999999999999LL;
  10. int n,m;
  11. struct Node{
  12. LL oe;
  13. LL oo;
  14. LL ee;
  15. LL eo;
  16. }node[maxn << 2];
  17. LL value[maxn];
  18. Node pushnode(Node p,Node q){
  19. Node newNode;
  20. newNode.oe = max(max(p.oe,q.oe),max(p.oo + q.ee,p.oe + q.oe));
  21. newNode.oo = max(max(p.oo,q.oo),max(p.oo + q.eo,p.oe + q.oo));
  22. newNode.ee = max(max(p.ee,q.ee),max(p.eo + q.ee,p.ee + q.oe));
  23. newNode.eo = max(max(p.eo,q.eo),max(p.eo + q.eo,p.ee + q.oo));
  24. return newNode;
  25. }
  26. void pushup(int pos){
  27. node[pos].oe = max(max(node[lson].oe,node[rson].oe),max(node[lson].oo + node[rson].ee,node[lson].oe + node[rson].oe));
  28. node[pos].oo = max(max(node[lson].oo,node[rson].oo),max(node[lson].oo + node[rson].eo,node[lson].oe + node[rson].oo));
  29. node[pos].ee = max(max(node[lson].ee,node[rson].ee),max(node[lson].eo + node[rson].ee,node[lson].ee + node[rson].oe));
  30. node[pos].eo = max(max(node[lson].eo,node[rson].eo),max(node[lson].eo + node[rson].eo,node[lson].ee + node[rson].oo));
  31. }
  32. void build(int l,int r,int pos){
  33. if(l == r){
  34. if(l & 1){
  35. node[pos].oe = node[pos].ee = node[pos].eo = -INF;
  36. node[pos].oo = value[l];
  37. }
  38. else{
  39. node[pos].oe = node[pos].oo = node[pos].eo = -INF;
  40. node[pos].ee = value[l];
  41. }
  42. return;
  43. }
  44. int mid = (l + r) >> 1;
  45. build(l,mid,lson);
  46. build(mid + 1,r,rson);
  47. pushup(pos);
  48. }
  49. void update(int l,int r,int pos,int to,int v){
  50. if(l == r){
  51. if(l & 1){
  52. node[pos].oe = node[pos].ee = node[pos].eo = -INF;
  53. node[pos].oo = v;
  54. }
  55. else{
  56. node[pos].oe = node[pos].oo = node[pos].eo = -INF;
  57. node[pos].ee = v;
  58. }
  59. return;
  60. }
  61. int mid = (l + r) >> 1;
  62. if(to <= mid)
  63. update(l,mid,lson,to,v);
  64. else
  65. update(mid + 1,r,rson,to,v);
  66. pushup(pos);
  67. }
  68. Node query(int l,int r,int L,int R,int pos){
  69. if(L <= l && r <= R){
  70. return node[pos];
  71. }
  72. int mid = (l + r) >> 1;
  73. if(R <= mid)
  74. return query(l,mid,L,R,lson);
  75. else if(L > mid)
  76. return query(mid + 1,r,L,R,rson);
  77. else{
  78. Node v1 = query(l,mid,L,R,lson);
  79. Node v2 = query(mid + 1,r,L,R,rson);
  80. return pushnode(v1,v2);
  81. }
  82. }
  83. int main(){
  84. int T;
  85. scanf("%d",&T);
  86. while(T--){
  87. scanf("%d%d",&n,&m);
  88. for(int i = 1; i <= n; i++){
  89. scanf("%I64d",&value[i]);
  90. }
  91. build(1,n,1);
  92. for(int i = 0; i < m; i++){
  93. int op;
  94. LL a,b;
  95. scanf("%d%I64d%I64d",&op,&a,&b);
  96. if(op == 0){
  97. Node nans = query(1,n,a,b,1);
  98. LL ans = max(max(nans.oo,nans.eo),max(nans.ee,nans.oe));
  99. printf("%I64d\n",ans);
  100. }
  101. else if(op == 1)
  102. update(1,n,1,a,b);
  103. }
  104. }
  105. return 0;
  106. }

【HDU 5316】Magician(线段树)的更多相关文章

  1. hdu 5316 Magician 线段树

    链接:http://acm.hdu.edu.cn/showproblem.php? pid=5316 Magician Time Limit: 18000/9000 MS (Java/Others)  ...

  2. hdu 5316 Magician 线段树维护最大值

    题目链接:Magician 题意: 给你一个长度为n的序列v,你需要对这个序列进行m次操作,操作一共有两种,输入格式为 type a b 1.如果type==0,你就需要输出[a,b]区间内的美丽序列 ...

  3. hdu 4031 attack 线段树区间更新

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

  4. hdu 4288 离线线段树+间隔求和

    Coder Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  5. hdu 3016 dp+线段树

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

  6. HDU 5316——Magician——————【线段树区间合并区间最值】

    Magician Time Limit: 18000/9000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  7. HDU 5316 Magician (线段树,单值修改,微变形)

    题意:给一个初始序列A[1,n],第j个数字代表精灵j的power值,有两种操作:(1)查询区间[L,R] (2)修改某个精灵的power值. 但,查询的是区间[L,R]中一个美丽子序列sub[l,r ...

  8. HDU 5877 dfs+ 线段树(或+树状树组)

    1.HDU 5877  Weak Pair 2.总结:有多种做法,这里写了dfs+线段树(或+树状树组),还可用主席树或平衡树,但还不会这两个 3.思路:利用dfs遍历子节点,同时对于每个子节点au, ...

  9. HDU 3308 LCIS (线段树区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 题目很好懂,就是单点更新,然后求区间的最长上升子序列. 线段树区间合并问题,注意合并的条件是a[ ...

  10. HDU 2795 Billboard (线段树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2795 题目大意:有一块h*w的矩形广告板,要往上面贴广告;   然后给n个1*wi的广告,要求把广告贴 ...

随机推荐

  1. 转 linux任务调度之crontab命令

    crontab命令常见于Unix和Linux的操作系统之中,用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于"crontab"文件中,以供之后读取和执行. 在 ...

  2. unittest (python标准库-开发工具-单元测试框架)

    unittest官方文档摘录 翻译 reffer to: https://docs.python.org/3/library/unittest.html#unittest.TextTestRunner ...

  3. zlib stream

      官方帮助手册 http://www.zlib.net/manual.html   #include <stdlib.h> #include <string.h> #incl ...

  4. SQL语句原理与高效SQL语句(转)

    做软件开发的programers,大部分都离不开跟数据库打交道,特别是erp开发的,跟数据库打交道更是频繁,存储过程动不动就是上千行,如果数据量大,人员流动大,那么还能保证下一段时间系统还能流畅的运行 ...

  5. MySQL 中的 base64 函数

    1. 5.6版本及之后的版本的base64 主要就是两个mysql内部函数to_base64和from_base64,使用也很简单,如下: 5.6之前不支持 mysql> select vers ...

  6. ANDROID模拟器访问本地WEB应用10.0.2.2

    在一般的Java Web程序开发中,我们通常使用localhost或者127.0.0.1来访问本机的Web服务,但是如果我们在Android模拟器中也采用同样的地址来访问,Android模拟器将无法正 ...

  7. RS-232

    RS-232 锁定 同义词 rs232一般指RS-232 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . 个人计算机上的通讯接口之一,由电子工业协会(Electronic Industr ...

  8. CURL简单使用

    学习地址:https://yq.aliyun.com/articles/33262 curl的简单使用步骤 要使用cURL来发送url请求,具体步骤大体分为以下四步: 1.初始化2.设置请求选项3.执 ...

  9. oracle调优 浅析“会话管理开销”

    调优之浅析"会话管理开销"   [简单介绍]        在调优的过程中,对于会话的管理是比較普遍的问题,由于维护会话的开销相对是比較高的. [过程表现例如以下]         ...

  10. 8.使用JPA保存数据【从零开始学Spring Boot】

    转载:http://blog.csdn.net/linxingliang/article/details/51636989 在看这一篇文档的话,需要先配置好JPA – hibernate. 总体步骤: ...