题目链接  Problem D

这个题类似 SPOJ GSS3

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

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

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

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

时间复杂度$O(nlogn)$

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)	for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i)
#define ls i << 1
#define rs i << 1 | 1
#define mid ((l + r) >> 1)
#define lson ls, l, mid
#define rson rs, mid + 1, r typedef long long LL; const int N = 1e5 + 10; struct node{
LL c, lc, rc, ret;
int lo, ro, flag;
} t[N << 2]; int n, m; void pushup(int i){
t[i].c = t[ls].c + t[rs].c;
t[i].ret = max(t[ls].ret, t[rs].ret);
t[i].flag = 0;
t[i].lc = t[ls].lc;
t[i].rc = t[rs].rc;
t[i].lo = t[ls].lo;
t[i].ro = t[rs].ro; if (t[ls].ro ^ t[rs].lo){
t[i].ret = max(t[i].ret, t[ls].rc + t[rs].lc);
if (t[ls].flag) t[i].lc = max(t[i].lc, t[ls].c + t[rs].lc);
if (t[rs].flag) t[i].rc = max(t[i].rc, t[rs].c + t[ls].rc);
if (t[ls].flag && t[rs].flag) t[i].flag = 1;
}
} void build(int i, int l, int r){
if (l == r){
scanf("%lld", &t[i].ret);
t[i].c = t[i].lc = t[i].rc = t[i].ret;
t[i].lo = t[i].ro = (t[i].ret & 1);
t[i].flag = 1;
return;
} build(lson);
build(rson);
pushup(i);
} void update(int i, int l, int r, int x, LL val){
if (l == x && l == r){
t[i].ret = t[i].c = t[i].lc = t[i].rc = val;
t[i].lo = t[i].ro = (val & 1);
t[i].flag = 1;
return;
} if (x <= mid) update(lson, x, val);
else update(rson, x, val);
pushup(i);
} node query(int i, int l, int r, int L, int R){
if (L <= l && r <= R) return t[i]; if (R <= mid) return query(lson, L, R);
if (L > mid) return query(rson, L, R); node ta = query(lson, L, mid);
node tb = query(rson, mid + 1, R); node ans;
ans.c = ta.c + tb.c;
ans.ret = max(ta.ret, tb.ret);
ans.flag = 0;
ans.lc = ta.lc;
ans.rc = tb.rc;
ans.lo = ta.lo;
ans.ro = tb.ro;
if (ta.ro ^ tb.lo){
ans.ret = max(ans.ret, ta.rc + tb.lc);
if (ta.flag) ans.lc = max(ans.lc, ta.c + tb.lc);
if (tb.flag) ans.rc = max(ans.rc, tb.c + ta.rc);
if (ta.flag && tb.flag) ans.flag = 1;
} return ans;
} int main(){ scanf("%d%d", &n, &m);
build(1, 1, n); while (m--){
int op;
scanf("%d", &op);
if (op == 0){
int x, y;
scanf("%d%d", &x, &y);
node ans = query(1, 1, n, x, y);
printf("%lld\n", ans.ret);
} else{
int x;
LL y;
scanf("%d%lld", &x, &y);
update(1, 1, n, x, y);
}
} return 0;
}

  

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. 《Cracking the Coding Interview》——第4章:树和图——题目7

    2014-03-19 04:48 题目:最近公共父节点问题. 解法1:Naive算法,先对其高度,然后一层一层往上直到找到结果. 代码: // 4.7 Least Common Ancestor // ...

  2. 服务过美国总统竞选的非传统投票UI [解析及DEMO]

    上篇文章和大家介绍了需求情况和难点分析,大家可以看这个链接了解详细    服务过美国总统竞选的非传统投票UI      =================正文开始=================== ...

  3. appium-desktop 环境搭建 Java版

    用的是appium-desktop1.8.1,testng6.11,java-client6.1.0,selenium-java3.13.0 1.下载逍遥模拟器,装好app 2.下载adb,用adb连 ...

  4. NodeJS05

    商品分类模块 分类model const mongoose = require('mongoose') const schema = new mongoose.Schema({ name: { typ ...

  5. 爬虫:Scrapy8 - Item Pipeline

    当 Item 在 Spider 中被收集之后,它将会被传递到 Item Pipeline,一些组件会按照一定的顺序执行对 Item 的处理. 每个 item pipeline 组件(有时也称之为“It ...

  6. JSP/Servlet Web 学习笔记 DayThree

    JSP内置对象 使用JSP语法可以存取这些内置对象来执行JSP网页的Servlet环境相互作用.内置对象其实是由特定的Java类所产生的.每一种内置对象都映射到一个特定的Java类或者端口,在服务器运 ...

  7. MPLAB设置路径

    大家都知道在MPLAB环境下编译程序,c文件.h文件.编译器生成的文件等等,都会被编译器无情的放在一个项目文件夹下. 稍微有些讲究的程序员可能就会觉得用MPLAB项目组织的一团糟.于是大家想到了一种方 ...

  8. HDU - 2814 Visible Trees

    题意: m*n(1<=m,n<=100000)的森林里,起始点在(1,1),某人从(0,0)点开始看,问能看到多少棵树. 题解: 求出1~x中的每个数与1~y的数中互质的数的总和.用素数筛 ...

  9. 股神小D [点分治 or LCT]

    题面 思路 点分治非常$naive$,不讲了,基本思路就是记录路径最小最大值.....然后没了 重点讲一下LCT的做法(好写不卡常)(点分一堆人被卡到飞起hhhh) 首先,这个路径限制由边限制决定,而 ...

  10. [codeforces] 97B Superset || 平面分治

    原题 给出一个平面的一些点,让你添加点,使得所有点对满足以下三个要求中的一个: 1.在一个水平面上 2.在一个竖直线上 3.以这两个点为对角的矩形内包含有其他点 输出一种可行解 因为只需要可行解,且只 ...