zoukankan      html  css  js  c++  java
  • HDU 1754 I Hate It(线段树解决RMQ问题)

    思路:

    这是线段树的裸题,可以解决区间最大/最小值查询、点修改问题;
    如果涉及区间修改,那就需要采用lazy方法了~

    代码:

    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int MAX_N=2e5+5; 
    int n,m,N;
    int dat[MAX_N<<2];
    void init(int n_){
    	N=1;
    	while(N<n_) N<<=1;
    	for(int i=0;i<(N<<1)-1;i++) dat[i]=0;
    }
    void update(int k,int a){
    	k+=N-1;
    	dat[k]=a;
    	while(k>0){
    		k=(k-1)>>1;
    		dat[k]=max(dat[(k<<1)+1],dat[(k<<1)+2]);
    	}
    }
    int query(int a,int b,int k,int l,int r){
    	if(r<=a||l>=b) return -1;
    	if(a<=l&&b>=r) return dat[k];
    	int vl=query(a,b,(k<<1)+1,l,(l+r)>>1);
    	int vr=query(a,b,(k<<1)+2,(l+r)>>1,r);
    	return max(vl,vr);
    }
    int main(){
    	while(~scanf("%d%d",&n,&m)){
    		init(n);
    		for(int i=0;i<n;i++){
    			int s;
    			scanf("%d",&s);
    			update(i,s);
    		}
    //		for(int i=0;i<(2*N)-1;i++) cerr<<dat[i]<<' '; putchar('
    ');
    		for(int i=0;i<m;i++){
    			char c;
    			do{c=getchar();}while(c!='Q'&&c!='U');
    			int a,b;
    			scanf("%d%d",&a,&b);
    			if(c=='Q') printf("%d
    ",query(a-1,b,0,0,N));
    			else update(a-1,b);
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    inndb 刷脏页
    mysql 创建索引
    mysql 索引异常:
    mysql change buffer
    mysql 事务
    mysql 全局锁和表锁
    mysql 索引优化
    mysql innoDB使用b+树作为索引
    mysql 中redo log bin log
    mysql 隔离级别
  • 原文地址:https://www.cnblogs.com/yuhan-blog/p/12308802.html
Copyright © 2011-2022 走看看