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
- HDU3308 线段树区间更新
- hdu3308 线段树区间合并
- hdu3308 线段树 区间合并
- 线段树区间维护hdu3308
- HDU3308->线段树区间合并
- hdu3308(线段树区间合并)
- HDU3308线段树区间合并
- hdu3308(线段树,区间合并)
- HDU3308:LCIS(线段树区间合并)
- hdu3308 LCIS(线段树区间合并)
- hdu3308 LCIS 线段树 区间合并
- 线段树区间合并 hdu3308 LCIS
- HDU3308-LCIS-线段树区间合并
- hdu3308(线段树,区间合并)
- HDU3308 LCIS(线段树区间合并)
- HDU3308区间合并+单点更新
- hdu3308 线段树 区间合并,单点跟新
- 线段树区间更新
- Flash Builder实用快捷键集锦
- PHP计算女朋友十年内生日是星期几
- C++之运算符重载升华版(Demo)
- android UiAutomator获取当前页面某类控件个数的方法
- Spring学习(1):控制反转(IoC)和依赖注入(DI)的详解以及注解(annotation)开发入门案例
- HDU3308 线段树区间更新
- LVS三种模式讲解
- 每天一个Linux命令(55):telnet
- jsp引用Struts标签库
- 【基础篇-堆栈】传值?传引用?(三)
- mysql 两个库之间复制表和表的数据
- Valid Palindrome
- 使用IntelliJ IDEA开发SpringMVC网站(一)开发环境
- animate.css的基本使用