博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU3308 LCIS
阅读量:5010 次
发布时间:2019-06-12

本文共 3212 字,大约阅读时间需要 10 分钟。

  原题传送:

  线段树,区间合并。

  节点记录下面变量:

  int l, r, c;   // 区间左端点、右端点和区间长度
  int lv, rv;    // 区间左值,右值
  int lsum, rsum, msum;  // 区间左上升长度,右上升长度,区间最大上升长度

 

View Code
1 #include 
2 #include
3 #define lson (cur << 1) 4 #define rson (cur << 1 | 1) 5 #define N 100010 6 7 int n, m, a[N]; 8 9 inline int max(int x, int y){
return x > y ? x : y;} 10 inline int min(int x, int y){
return x < y ? x : y;} 11 12 struct node 13 { 14 int l, r, c; // 区间左端点、右端点和区间长度 15 int lv, rv; // 区间左值,右值 16 int lsum, rsum, msum; // 区间左上升长度,右上升长度,最大上升长度 17 }tree[N << 2]; 18 19 void pushup(int cur) 20 { 21 tree[cur].lv = tree[lson].lv; 22 tree[cur].rv = tree[rson].rv; 23 tree[cur].lsum = tree[lson].lsum; 24 tree[cur].rsum = tree[rson].rsum; 25 tree[cur].msum = max(tree[lson].msum, tree[rson].msum); 26 if(tree[lson].rv < tree[rson].lv) 27 { 28 if(tree[lson].lsum == tree[lson].c && tree[lson].rv < tree[rson].lv) 29 tree[cur].lsum += tree[rson].lsum; 30 if(tree[rson].rsum == tree[rson].c && tree[rson].lv > tree[lson].rv) 31 tree[cur].rsum += tree[lson].rsum; 32 33 tree[cur].msum = max(tree[cur].msum, tree[lson].rsum + tree[rson].lsum); 34 } 35 } 36 37 void update(int cur, int loc, int v) 38 { 39 if(tree[cur].l == tree[cur].r) 40 { 41 tree[cur].lv = tree[cur].rv = v; 42 return ; 43 } 44 int mid = (tree[cur].l + tree[cur].r) >> 1; 45 if(mid >= loc) 46 update(lson, loc, v); 47 else 48 update(rson, loc, v); 49 pushup(cur); 50 } 51 52 int query(int cur, int l, int r) 53 { 54 if(tree[cur].l >= l && tree[cur].r <= r){ 55 return tree[cur].msum; 56 } 57 int mid = (tree[cur].l + tree[cur].r) >> 1; 58 int ans = 0; 59 if(mid >= l) ans = max(ans, query(lson, l, r)); 60 if(mid < r) ans = max(ans, query(rson, l, r)); 61 if(tree[lson].rv < tree[rson].lv){ 62 ans = max(ans, min(mid - l + 1, tree[lson].rsum) + min(r - mid, tree[rson].lsum)); 63 } 64 return ans; 65 } 66 67 void build(int cur, int l, int r) 68 { 69 tree[cur].l = l, tree[cur].r = r, tree[cur].c = r - l + 1; 70 if(l == r) 71 { 72 tree[cur].lv = tree[cur].rv = a[l]; 73 tree[cur].lsum = tree[cur].rsum = tree[cur].msum = 1; 74 return ; 75 } 76 int mid = (l + r) >> 1; 77 build(lson, l, mid); 78 build(rson, mid + 1, r); 79 pushup(cur); 80 } 81 82 int main() 83 { 84 int cas, i, x, y; 85 char op[5]; 86 scanf("%d", &cas); 87 while(cas --) 88 { 89 scanf("%d%d", &n, &m); 90 for(i = 1; i <= n; i ++) 91 scanf("%d", &a[i]); 92 build(1, 1, n); 93 while(m --) 94 { 95 scanf("%s%d%d", op, &x, &y); 96 if(op[0] == 'Q') 97 { 98 printf("%d\n", query(1, x + 1, y + 1)); 99 }100 else if(op[0] == 'U')101 {102 update(1, x + 1, y);103 }104 }105 }106 return 0;107 }

转载于:https://www.cnblogs.com/huangfeihome/archive/2012/10/01/2709874.html

你可能感兴趣的文章
做最好的自己(Be Your Personal Best)
查看>>
如何搭建github+hexo博客-转
查看>>
HW2.2
查看>>
将Windows Server 2016 打造成工作站(20161030更新)
查看>>
5大主浏览器css3和html5兼容性大比拼
查看>>
hdu-5894 hannnnah_j’s Biological Test(组合数学)
查看>>
scss常规用法
查看>>
css定位position属性深究
查看>>
android中不同版本兼容包的区别
查看>>
Static 与 new 的问题【待解决】
查看>>
xml
查看>>
在 mvc4 WebApi 中 json 的 跨域访问
查看>>
敏捷开发文章读后感
查看>>
xposed获取context 的方法
查看>>
html5 canvas 图像处理
查看>>
He who hesitates is Lost
查看>>
php中引用&的真正理解-变量引用、函数引用、对象引用
查看>>
关于<form> autocomplete 属性
查看>>
OutOfMemory
查看>>
LeetCode:组合总数III【216】
查看>>