HDU1754-I Hate It

题目大意:

多组样例,每组样例\(n\)个学生,每个学生的成绩为\(q_i\)\(m\)次操作。
两种操作:
\(C\)\('Q'\)的时候,表示这是一条询问操作,它询问\(ID\)\(A\)\(B\)(包括\(A,B\))的学生当中,成绩最高的是多少。
\(C\)\('U'\)的时候,表示这是一条更新操作,要求把\(ID\)\(A\)的学生的成绩更改为\(B\)

思路:

线段树入门题,考察单点修改,区间最大值查询,此处仅作复习用处,不对线段树基础进行讲解。

Code:

#include<bits/stdc++.h>
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define mid (l+r)/2
using namespace std;
const int maxn=2e5+10;
//单点修改 区间查询 
int t,x,y,n,m;
char s[10];
int q[maxn];
struct node{
	int tr[maxn],lazy[maxn];
	void pushup(int rt){
		tr[rt]=max(tr[rt<<1],tr[rt<<1|1]);
	}
	void pushdown(int l,int r,int rt){
		
	}
	void build(int l,int r,int rt){
		if(l==r){
			tr[rt]=q[l];
			return ;
		}
		build(lson);
		build(rson);
		pushup(rt);
	}
	void update(int L,int R,int l,int r,int rt,int val){
		if(L<=l&&r<=R){
			tr[rt]=val;
			return ;
		}
		if(L<=mid){
			update(L,R,l,mid,rt<<1,val);
		}
		if(R>mid){
			update(L,R,mid+1,r,rt<<1|1,val);
		}
		pushup(rt);
	}
	int query(int L,int R,int l,int r,int rt){
		if(L<=l&&r<=R){
			return tr[rt];
		}
		int sum=-0x3f3f3f3f;
		if(L<=mid){
			sum=max(sum,query(L,R,lson));
		}
		if(R>mid){
			sum=max(sum,query(L,R,rson));
		}
		return sum;
	}
}sgt;
int main(){
	while(scanf("%d%d",&n,&m)!=EOF){
		
		for(int i=1;i<=n;++i){
			scanf("%d",&q[i]);
		}
		sgt.build(1,n,1);
		while(m--){
			scanf("%s",s);
			scanf("%d%d",&x,&y);
			if(s[0]=='Q'){
				printf("%d\n",sgt.query(x,y,1,n,1));
			}
			else{
				sgt.update(x,x,1,n,1,y);
			}
		}
	}
	return 0;
}
posted @ 2021-03-16 15:24  Qquun  阅读(44)  评论(0)    收藏  举报