HDU3308 LCIS
来源:互联网 发布:win7不能网络共享 编辑:程序博客网 时间:2024/05/16 05:24
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308
线段树单点更新+区间合并,特殊的地方就是合并的时候考虑两个相邻的数是否符合条件,判断一下再决定是否合并
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define lson l, m, rt<<1#define rson m + 1, r, rt<<1|1const int maxn = 111111;int llci[maxn<<2], rlci[maxn<<2], mlci[maxn<<2];int a[maxn];void PushUp(int l, int r, int rt){ llci[rt] = llci[rt<<1]; rlci[rt] = rlci[rt<<1|1]; mlci[rt] = max(mlci[rt<<1], mlci[rt<<1|1]); int m = (l + r) >> 1; if (a[m] < a[m + 1]){ if (llci[rt] == m - l + 1) llci[rt] += llci[rt<<1|1]; if (rlci[rt] == r - m) rlci[rt] += rlci[rt<<1]; mlci[rt] = max(mlci[rt], llci[rt<<1|1] + rlci[rt<<1]); }}void build(int l, int r, int rt){ if (l == r){ llci[rt] = rlci[rt] = mlci[rt] = 1; return; } int m = (l + r) >> 1; build(lson); build(rson); PushUp(l, r, rt);}void update(int x, int c, int l, int r, int rt){ if (l == r){ a[l] = c; return; } int m = (l + r) >> 1; if (x <= m) update(x, c, lson); else update(x, c, rson); PushUp(l, r, rt);}int query(int ll, int rr, int l, int r, int rt){ if (ll == l && rr == r) return mlci[rt]; int m = (l + r) >> 1; if (rr <= m) return query(ll, rr, lson); else if (ll > m) return query(ll, rr, rson); else{ int x = query(ll, m, lson); int y = query(m + 1, rr, rson); int z = 0; if (a[m] < a[m + 1]){ z += min(llci[rt<<1|1], rr - m); z += min(rlci[rt<<1], m - ll + 1); } return max(x, max(y, z)); }}int main(){ int t; scanf("%d", &t); while (t--){ int n, m; scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++) scanf("%d", &a[i]); build(1, n, 1); char op[2]; int x, y; while (m--){ scanf("%s%d%d", op, &x, &y); x += 1; if (op[0] == 'U') update(x, y, 1, n, 1); else{ y += 1; int ans = query(x, y, 1, n, 1); printf("%d\n", ans); } } } return 0;}
- HDU3308 LCIS
- HDU3308--LCIS
- hdu3308 LCIS
- HDU3308 LCIS
- hdu3308----LCIS
- hdu3308 LCIS
- hdu3308 LCIS
- HDU3308-LCIS
- HDU3308 LCIS
- 【43.49%】【hdu3308】LCIS
- hdu3308 LCIS 线段树 难题
- hdu3308 LCIS(简单线段树)
- hdu3308 LCIS(区间求和)
- HDU3308:LCIS(线段树区间合并)
- hdu3308 LCIS(线段树区间合并)
- hdu3308 LCIS 线段树 区间合并
- 线段树区间合并 hdu3308 LCIS
- HDU3308-LCIS-线段树区间合并
- PostgreSQL
- C++琐碎知识(不断更新)
- 2013年3月24日 周赛 解题报告 -- from lanshui_Yang
- 在VC中使用Debug
- 从Trie树(字典树)谈到后缀树
- HDU3308 LCIS
- 教你透彻了解红黑树
- coco2d-x android win7 环境配置
- 【C++复习三】C++ 运算符优先级与结合性
- 只出现一次的数
- 如何得到相对路径(MFC)
- Extjs4 grid selectChange多次触发问题
- 开源个我的 x86 架构操作系统的 boot 程序
- Activity的生命周期