题目链接  Problem D

这个题类似 SPOJ GSS3

做过那个题之后其实就可以秒掉这题了。

考虑当前线段树维护的结点

在那道题的基础上,这个题要多维护几个东西,大概就是左端点的奇偶性,右端点的奇偶性。

以及当前结点代表的区间是否是一个有效的子序列。

时间复杂度$O(nlogn)$

  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define rep(i, a, b) for (int i(a); i <= (b); ++i)
  6. #define dec(i, a, b) for (int i(a); i >= (b); --i)
  7. #define ls i << 1
  8. #define rs i << 1 | 1
  9. #define mid ((l + r) >> 1)
  10. #define lson ls, l, mid
  11. #define rson rs, mid + 1, r
  12.  
  13. typedef long long LL;
  14.  
  15. const int N = 1e5 + 10;
  16.  
  17. struct node{
  18. LL c, lc, rc, ret;
  19. int lo, ro, flag;
  20. } t[N << 2];
  21.  
  22. int n, m;
  23.  
  24. void pushup(int i){
  25. t[i].c = t[ls].c + t[rs].c;
  26. t[i].ret = max(t[ls].ret, t[rs].ret);
  27. t[i].flag = 0;
  28. t[i].lc = t[ls].lc;
  29. t[i].rc = t[rs].rc;
  30. t[i].lo = t[ls].lo;
  31. t[i].ro = t[rs].ro;
  32.  
  33. if (t[ls].ro ^ t[rs].lo){
  34. t[i].ret = max(t[i].ret, t[ls].rc + t[rs].lc);
  35. if (t[ls].flag) t[i].lc = max(t[i].lc, t[ls].c + t[rs].lc);
  36. if (t[rs].flag) t[i].rc = max(t[i].rc, t[rs].c + t[ls].rc);
  37. if (t[ls].flag && t[rs].flag) t[i].flag = 1;
  38. }
  39. }
  40.  
  41. void build(int i, int l, int r){
  42. if (l == r){
  43. scanf("%lld", &t[i].ret);
  44. t[i].c = t[i].lc = t[i].rc = t[i].ret;
  45. t[i].lo = t[i].ro = (t[i].ret & 1);
  46. t[i].flag = 1;
  47. return;
  48. }
  49.  
  50. build(lson);
  51. build(rson);
  52. pushup(i);
  53. }
  54.  
  55. void update(int i, int l, int r, int x, LL val){
  56. if (l == x && l == r){
  57. t[i].ret = t[i].c = t[i].lc = t[i].rc = val;
  58. t[i].lo = t[i].ro = (val & 1);
  59. t[i].flag = 1;
  60. return;
  61. }
  62.  
  63. if (x <= mid) update(lson, x, val);
  64. else update(rson, x, val);
  65. pushup(i);
  66. }
  67.  
  68. node query(int i, int l, int r, int L, int R){
  69. if (L <= l && r <= R) return t[i];
  70.  
  71. if (R <= mid) return query(lson, L, R);
  72. if (L > mid) return query(rson, L, R);
  73.  
  74. node ta = query(lson, L, mid);
  75. node tb = query(rson, mid + 1, R);
  76.  
  77. node ans;
  78. ans.c = ta.c + tb.c;
  79. ans.ret = max(ta.ret, tb.ret);
  80. ans.flag = 0;
  81. ans.lc = ta.lc;
  82. ans.rc = tb.rc;
  83. ans.lo = ta.lo;
  84. ans.ro = tb.ro;
  85. if (ta.ro ^ tb.lo){
  86. ans.ret = max(ans.ret, ta.rc + tb.lc);
  87. if (ta.flag) ans.lc = max(ans.lc, ta.c + tb.lc);
  88. if (tb.flag) ans.rc = max(ans.rc, tb.c + ta.rc);
  89. if (ta.flag && tb.flag) ans.flag = 1;
  90. }
  91.  
  92. return ans;
  93. }
  94.  
  95. int main(){
  96.  
  97. scanf("%d%d", &n, &m);
  98. build(1, 1, n);
  99.  
  100. while (m--){
  101. int op;
  102. scanf("%d", &op);
  103. if (op == 0){
  104. int x, y;
  105. scanf("%d%d", &x, &y);
  106. node ans = query(1, 1, n, x, y);
  107. printf("%lld\n", ans.ret);
  108. }
  109.  
  110. else{
  111. int x;
  112. LL y;
  113. scanf("%d%lld", &x, &y);
  114. update(1, 1, n, x, y);
  115. }
  116. }
  117.  
  118. return 0;
  119. }

  

Wannafly挑战赛10 D 小H的询问(线段树)的更多相关文章

  1. Wannafly挑战赛2_D Delete(拓扑序+最短路+线段树)

    Wannafly挑战赛2_D Delete Problem : 给定一张n个点,m条边的带权有向无环图,同时给定起点S和终点T,一共有q个询问,每次询问删掉某个点和所有与它相连的边之后S到T的最短路, ...

  2. 【牛客Wannafly挑战赛12】小H和圣诞树

    题目 可以考虑边分治,对于某一种颜色,我们处理出分治边左右两边所有以这个颜色为端点的路径长度,之后随便拼一拼就好了 但是这样对于每一组询问都需要边分一遍,这样做复杂度是\(O(nm+n\log n)\ ...

  3. 【Wannafly挑战赛29F】最后之作(Trie树,动态规划,斜率优化)

    [Wannafly挑战赛29F]最后之作(Trie树,动态规划,斜率优化) 题面 牛客 题解 首先考虑怎么计算\([l,r]\)这个子串的不同的串的个数. 如果\(l=1\),我们构建\(Trie\) ...

  4. 【Wannafly挑战赛10 - B】小H和密码(DP)

    试题链接:https://www.nowcoder.com/acm/contest/72/B 题目描述     小H在击败怪兽后,被一个密码锁挡住了去路     密码锁由N个转盘组成,编号为1~N,每 ...

  5. Wannafly挑战赛10:A题:小H和迷宫

    题目描述       小H陷入了一个迷宫中,迷宫里有一个可怕的怪兽,血量有N点,小H有三瓶魔法药水,分别可以使怪兽损失a%.b%.c%的血量(之后怪兽的血量会向下取整),小H想合理地运用这三瓶药水,使 ...

  6. BZOJ 3065 带插入区间K小值(sag套线段树)

    3065: 带插入区间K小值 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 4696  Solved: 1527[Submit][Status][Di ...

  7. SPOJ-COT-Count on a tree(树上路径第K小,可持久化线段树)

    题意: 求树上A,B两点路径上第K小的数 分析: 同样是可持久化线段树,只是这一次我们用它来维护树上的信息. 我们之前已经知道,可持久化线段树实际上是维护的一个前缀和,而前缀和不一定要出现在一个线性表 ...

  8. 树上第k小,可持久化线段树+倍增lca

    给定一颗树,树的每个结点都有权值, 有q个询问,每个询问是 u v k ,表示u到v路径上第k小的权值是多少. 每个结点所表示的线段树,是父亲结点的线段树添加该结点的权值之后形成的新的线段树 c[ro ...

  9. 2018.07.08 hdu4521 小明系列问题——小明序列(线段树+简单dp)

    小明系列问题--小明序列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Proble ...

随机推荐

  1. jQuery监控动画执行完毕事件

    $('#yourElement').one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend' ...

  2. 详解zabbix2.2.2安装部署(Server端篇)

    今天开始安装zabbix.zabbix需要LNMP或者LAMP环境.环境的搭建不在本章范围内. LNMP环境配置 Linux安装:http://www.osyunwei.com/archives/10 ...

  3. 自动化测试(二)如何用python写一个用户登陆功能

    需求信息: 写一个判断登录的程序: 输入: username password 最大错误次数是3次,输入3次都没有登录成功,提示错误次数达到上限 需要判断输入是否为空,什么也不输入,输入一个空格.n个 ...

  4. jmeter运行脚本后,请求偶发性的传参错误

    问题现象:jmeter写好脚本后,请求偶发性的传参错误 排查过程:1.结合报错返回值,看是不是线程并发引起: 2.排除线程并发引起后,看看是不是取值策略:如果是参数化,看看是不是每次迭代,每次都取唯一 ...

  5. leetcode 208. 实现 Trie (前缀树)

    实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作. 示例: Trie trie = new Trie(); trie.insert(" ...

  6. django QuerySet 的常用API

    为了加深对queryset对象api的了解,我们建立了以下示例模型: from django.db import models class Author(models.Model): "&q ...

  7. HDU 4116 Fruit Ninja ( 计算几何 + 扫描线 )

    给你最多1000个圆,问画一条直线最多能与几个圆相交,相切也算. 显然临界条件是这条线是某两圆的公切线,最容易想到的就是每两两圆求出所有公切线,暴力判断一下. 可惜圆有1000个,时间复杂度太高. 网 ...

  8. 普通用户操作tomcat项目时报:Neither the JAVA_HOME nor the JRE_HOME environment variable is defined At least one of these environment variable is needed to run this program

    在使用普通用户更新tomcat项目适合出现这个信息,Neither the JAVA_HOME nor the JRE_HOME environment variable is defined At ...

  9. ocrosoft Contest1316 - 信奥编程之路~~~~~第三关 问题 E: IQ(iq)

    http://acm.ocrosoft.com/problem.php?cid=1316&pid=4 题目描述 根据世界某权威学会的一项调查,学信息学的学生IQ非常高.举个最好的例子,如果我们 ...

  10. qemu中是怎么模拟的新的设备

    kvm_cpu_exec 和demo中演示的一样