题意:

T个测试数据

n个数 q个查询

n个数 ( 下标从0开始)

Q u v 查询 [u, v ] 区间最长连续上升子序列

U u v 把u位置改成v

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<algorithm>
  5. using namespace std;
  6. #define N 101010
  7. #define L(x) (x<<1)
  8. #define R(x) (x<<1|1)
  9. inline int Max(int a,int b){return a>b?a:b;}
  10. inline int Min(int a,int b){return a<b?a:b;}
  11.  
  12. struct node
  13. {
  14. int l,r;
  15. int mid(){ return (l+r)>>1; }
  16. int len(){ return r-l+1; }
  17. int Llen, Rlen, maxlen;
  18.  
  19. }tree[4*N];
  20. int a[N];
  21. void updata_up(int id){
  22. tree[id].Llen = tree[L(id)].Llen;
  23. tree[id].Rlen = tree[R(id)].Rlen;
  24. tree[id].maxlen = Max( tree[L(id)].maxlen, tree[R(id)].maxlen);
  25.  
  26. if( a[ tree[L(id)].r ] < a[ tree[R(id)].l ] )
  27. {
  28. if( tree[L(id)].Llen == tree[L(id)].len())
  29. {
  30. tree[id].Llen += tree[R(id)].Llen;
  31. tree[id].maxlen = Max( tree[id].maxlen, tree[id].Llen);
  32. }
  33. if( tree[R(id)].Rlen == tree[R(id)].len() )
  34. {
  35. tree[id].Rlen += tree[L(id)].Rlen;
  36. tree[id].maxlen = Max( tree[id].maxlen, tree[id].Rlen);
  37. }
  38. tree[id].maxlen = Max( tree[id].maxlen, tree[L(id)].Rlen + tree[R(id)].Llen );
  39.  
  40. }
  41.  
  42. }
  43. void build(int l, int r, int id){
  44. tree[id].l = l, tree[id].r = r;
  45.  
  46. if(l==r){ tree[id].Llen = tree[id].Rlen = tree[id].maxlen =1; return ; }
  47.  
  48. int mid = (l+r)>>1;
  49. build(l, mid, L(id));
  50. build(mid+1, r, R(id));
  51. updata_up(id);
  52. }
  53.  
  54. void updata(int pos,int id){
  55. if(tree[id].l == tree[id].r)return ;
  56.  
  57. int mid = tree[id].mid();
  58. if( pos <= mid ) updata(pos, L(id));
  59. else updata(pos, R(id));
  60. updata_up(id);
  61. }
  62.  
  63. int query(int l, int r, int id){
  64. if( l == tree[id].l && tree[id].r == r)
  65. return tree[id].maxlen;
  66.  
  67. int mid = tree[id].mid();
  68. if(r <= mid)return query(l, r, L(id));
  69. else if(mid < l) return query(l, r, R(id));
  70.  
  71. int L = query(l, mid, L(id)), R = query(mid+1, r, R(id));
  72.  
  73. if( a[mid] < a[mid+1] ){
  74. int LL = Min( mid - l + 1, tree[L(id)].Rlen);
  75. int RR = Min( r - mid, tree[R(id)].Llen);
  76. return Max( Max(L,R), LL+RR);
  77. }
  78. else return Max(L, R);
  79. }
  80.  
  81. int main(){
  82. int T,n,q,i; scanf("%d",&T);
  83. while(T--){
  84. scanf("%d %d", &n, &q);
  85. for(i=1;i<=n;i++)scanf("%d",&a[i]);
  86.  
  87. build(1, n, 1);
  88. while(q--)
  89. {
  90. char c = '-';
  91. while(c!='Q' && c!='U') c = getchar();
  92. int u,v; scanf("%d %d", &u, &v);
  93.  
  94. if(c == 'Q')
  95. printf("%d\n", query(u+1, v+1, 1));
  96. else if(c == 'U')
  97. { a[u+1] = v; updata(u+1, 1); }
  98.  
  99. }
  100. }
  101. return 0;
  102. }
  103. /*
  104. 99
  105. 10 10
  106. 7 7 3 3 5 9 9 8 1 8
  107. Q 6 6
  108. U 3 4
  109. Q 0 1
  110. Q 0 5
  111. Q 4 7
  112. Q 3 5
  113. Q 0 2
  114. Q 4 6
  115. U 6 10
  116. Q 0 9
  117.  
  118. 10 99
  119. 1 2 3 4 5 6 7 8 9 10
  120. Q 4 7
  121. U 0 8
  122. Q 0 9
  123. U 8 8
  124.  
  125. Q 0 9
  126.  
  127. */

HDU 3308 线段树 最长连续上升子序列 单点更新 区间查询的更多相关文章

  1. HDU 3308 线段树求区间最长连续上升子序列长度

    题意:两种操作,Q L R查询L - R 的最长连续上升子序列长度,U pos val 单点修改值 #include <bits/stdc++.h> #define N 100005 us ...

  2. hdu 3308(线段树区间合并)

    LCIS Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  3. hdu 3308 线段树

    题目大意:给n个数,两种操作1:U  a b   更新第a个为b (从0开始)2: Q    a ,b  查询 a,b之间LCIS(最长连续递增子序列)的长度. Sample Input110 107 ...

  4. HDU 3308 线段树单点更新+区间查找最长连续子序列

    LCIS                                                              Time Limit: 6000/2000 MS (Java/Oth ...

  5. hdu 3308 线段树,单点更新 求最长连续上升序列长度

    LCIS Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  6. hdu 3308 线段树 区间合并+单点更新+区间查询

    LCIS Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  7. hdu 3397 线段树双标记

    Sequence operation Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  8. hdu 2871 线段树(各种操作)

    Memory Control Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  9. hdu 1166 线段树(sum+单点修改)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

随机推荐

  1. CodeForces 478B 第八次比赛 B题

    Description n participants of the competition were split into m teams in some manner so that each te ...

  2. Eclipse 下 opennms 开发环境搭建

    1.eclipse3.5或更高版本,并且使用纯净的java版.下载地址:Eclipse for Java Developers. 2.安装需要的插件.通过Help/Install New Softwa ...

  3. String面试题

    //a b c 分别是怎么存储的, a和b a和c分别有什么区别// c和d的区别是什么 String a= "hello";String b= "hello" ...

  4. 从零开始学ios开发(十七):Storyboards(上)

    在开始这章之前,先做个说明,从这篇开始,我所使用的xcode更新成了最新的版本,版本是4.6.1(4H512),如下: 大家可以打开自己电脑上的App Store,然后搜索xcode,第一个出现的就是 ...

  5. 【UIScrollView】基本方法+基本描述

    scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(, , , )]; scrollView.backgroundColor = [ ...

  6. 《C++Primer》复习——with C++11 [4]

    考虑到STL的掌握主要靠的是练习,所以对于STL这部分,我把书中的练习都做一遍,加深印象.这些练习是第9.10.11.17章的,分别是顺序容器.泛型算法和关联容器等. ——10月22日 /*----- ...

  7. arcgis for server 登陆manager失败解决办法

    版本是 arcgis for server 10.02 症状 1. manager网页无法打开http://localhost:6080/arcgis/manager/ 2. 查看服务无法启动,启动后 ...

  8. Luence简单实现2

    上一篇是基于内存存储的,这次的例子是基于本地存储索引库. 上一次的代码稍微修改,代码如下: //创建词法分析器 Analyzer analyzer = new StandardAnalyzer(); ...

  9. Python求算数平方根和约数

    一.求算术平方根 a=0 x=int(raw_input('Enter a number:')) if x >= 0: while a*a < x: a = a + 1 if a*a != ...

  10. html+css学习笔记 [基础1]

    ---------------------------------------------------------------------------------------------------- ...