HDU3308 线段树区间更新

来源:互联网 发布:linux 如何配置snmp 编辑:程序博客网 时间:2024/06/04 18:18

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

import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.util.StringTokenizer;public class Main {public static void main(String[] args) {new Task().solve(); }}class Task{InputReader in = new InputReader(System.in) ;PrintWriter out = new PrintWriter(System.out) ;int[] num ;    int[] lmax , rmax , max ;        void up(int l , int r , int t){    lmax[t] = lmax[t<<1] ;    rmax[t] = rmax[t<<1|1] ;    max[t] = Math.max(max[t<<1] , max[t<<1|1]) ;    int m = (l + r) >> 1 ;    if(num[m] < num[m+1]){    if(lmax[t<<1] == m - l + 1) lmax[t] += lmax[t<<1|1] ;    if(rmax[t<<1|1] == r - m) rmax[t] += rmax[t<<1] ;    max[t] = Math.max(max[t] , rmax[t<<1] + lmax[t<<1|1]) ;    }    }        void build(int l , int r , int t){    if(l == r){    lmax[t] = rmax[t] = max[t] = 1 ;    return ;    }    int m = (l + r) >> 1 ;    build(l , m , t<<1) ;    build(m+1 , r , t<<1|1) ;    up(l , r , t) ;    }        void update(int i , int c , int l , int r , int t){    if(l == r){    num[i] = c ;    return ;     }    int m = (l + r) >> 1 ;    if(i <= m) update(i , c , l , m , t<<1) ;    else update(i , c , m+1 , r , t<<1|1) ;    up(l , r , t) ;    }        int query(int L , int R , int l , int r , int t){    if(L <= l && r <= R) return max[t] ;    int m = (l + r) >> 1 ;    if(R <= m) return query(L , R , l , m , t<<1) ;    else if(L > m) return query(L , R , m+1 , r , t<<1|1) ;    else{    int res = Math.max(query(L , R , l , m , t<<1) , query(L , R , m+1 , r , t<<1|1)) ;    if(num[m] < num[m+1]){         res = Math.max(res , Math.min(m-L+1, rmax[t<<1]) + Math.min(R-m, lmax[t<<1|1])) ;    }    return res ;    }    }void solve(){int t = in.nextInt() ;while(t-- > 0){int n = in.nextInt() , m = in.nextInt() ;num = new int[n] ;lmax = new int[n<<2] ;rmax = new int[n<<2] ;max = new int[n<<2] ;for(int i = 0 ; i < n ; i++) num[i] = in.nextInt() ; build(0 , n-1 , 1);while(m-- > 0){if("Q".equals(in.next()))out.println(query(in.nextInt() , in.nextInt() , 0 , n-1 , 1)) ;else update(in.nextInt() , in.nextInt() , 0 , n-1 , 1) ;}}out.flush();}    } class InputReader {      public BufferedReader reader;      public StringTokenizer tokenizer;        public InputReader(InputStream stream) {          reader = new BufferedReader(new InputStreamReader(stream), 32768);          tokenizer = new StringTokenizer("");      }         private void eat(String s) {          tokenizer = new StringTokenizer(s);      }        public String nextLine() {          try {              return reader.readLine();          } catch (Exception e) {              return null;          }      }         public boolean hasNext() {          while (!tokenizer.hasMoreTokens()) {              String s = nextLine();              if (s == null)                  return false;              eat(s);          }          return true;      }        public String next() {          hasNext();          return tokenizer.nextToken();      }        public int nextInt() {          return Integer.parseInt(next());      }        public long nextLong() {          return Long.parseLong(next());      }        public double nextDouble() {          return Double.parseDouble(next());      }        public BigInteger nextBigInteger() {          return new BigInteger(next());      }    }  






0 0
原创粉丝点击