hdu 5316 Magician(线段树)
2015-07-28 20:50
381 查看
题目链接:hdu 5316 Magician
线段树,区间合并,每个节点维护两端位置分别为奇奇,奇偶,偶奇,偶偶的beautiful 子串,合并的时候注意不能为空即可。
线段树,区间合并,每个节点维护两端位置分别为奇奇,奇偶,偶奇,偶偶的beautiful 子串,合并的时候注意不能为空即可。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const int maxn = 100005; const ll inf = 0x3f3f3f3f3f3f3f3f; #define lson(x) ((x)<<1) #define rson(x) (((x)<<1)|1) struct Edge { ll oo, oe, eo, ee; Edge() { oo = oe = eo = ee = -inf; } ll Answer() { return max(max(oo, oe), max(eo, ee)); } }s[maxn << 2]; int lc[maxn << 2], rc[maxn << 2]; int N, M, A[maxn]; Edge merge(Edge l, Edge r) { Edge ret; ret.oo = max(l.oo + r.eo, l.oe + r.oo); ret.oo = max(ret.oo, max(l.oo, r.oo)); ret.oe = max(l.oo + r.ee, l.oe + r.oe); ret.oe = max(ret.oe, max(l.oe, r.oe)); ret.eo = max(l.eo + r.eo, l.ee + r.oo); ret.eo = max(ret.eo, max(l.eo, r.eo)); ret.ee = max(l.eo + r.ee, l.ee + r.oe); ret.ee = max(ret.ee, max(l.ee, r.ee)); return ret; } void maintain(int u, int x, ll d) { if (x&1) { s[u].oo = d; s[u].ee = -inf; } else { s[u].oo = -inf; s[u].ee = d; } s[u].oe = s[u].eo = -inf; } void pushup(int u) { s[u] = merge(s[lson(u)], s[rson(u)]); } void build(int u, int l, int r) { lc[u] = l; rc[u] = r; if (l == r) { maintain(u, l, A[l]); return; } int mid = (l + r) >> 1; build(lson(u), l, mid); build(rson(u), mid+1, r); pushup(u); } void modify(int u, int x, ll d) { if (lc[u] == rc[u]) { maintain(u, x, d); return; } int mid = (lc[u] + rc[u]) >> 1; if (x <= mid) modify(lson(u), x, d); if (x > mid) modify(rson(u), x, d); pushup(u); } Edge query(int u, int l, int r) { if (l <= lc[u] && rc[u] <= r) return s[u]; Edge ret; int mid = (lc[u] + rc[u]) >> 1; if (l <= mid) ret = merge(ret, query(lson(u), l, r)); if (r > mid) ret = merge(ret, query(rson(u), l, r)); return ret; } int main () { int cas; scanf("%d", &cas); while (cas--) { scanf("%d%d", &N, &M); for (int i = 1; i <= N; i++) scanf("%d", &A[i]); build(1, 1, N); int type, l, r; for (int i = 0; i < M; i++) { scanf("%d%d%d", &type, &l, &r); if (type) modify(1, l, r); else { Edge ret = query(1, l, r); printf("%lld\n", ret.Answer()); } } } return 0; }
相关文章推荐
- 【Cocos2d-js教程】cocos2d-js 富文本 RichText
- 7.27JAVA基础
- iOS 统一定制导航栏的 appearance 方法
- KMP水题
- 苹果
- #include<>与#include""的区别
- intersect_lines_of_sight_targets.hdev计算了两个镜头下一个立体的高 相关例程学习
- 2015年读书索引
- apache通过rewrite限制某个目录
- iOS前期OC训练OC_07类的扩展
- innerHTML,innerText,outHTML的用法及区别详解
- 【2015多校联赛-3】【B题RGCDQ】
- 对话框判断按下了‘确认键’还是‘取消键’
- Android SDK及环境配置
- 利用Cookie,实现动态显示用户曾经浏览过的商品
- ubuntu netstat 查看端口占用情况
- 【linux高级程序设计】(第十章)Linux异步信号处理机制 2
- c#流的总结
- QT1.1-与Opencv的hello world
- 对称加密和非对称加密介绍和区别