zoukankan      html  css  js  c++  java
  • HDU 1754 I Hate It (线段树)

    描述

    很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
    这让很多学生很反感。

    不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。

    输入

    本题目包含多组测试,请处理到文件结束。
    在每个测试的第一行,有两个正整数 N 和 M ( 0<N<=200000,0<M<5000 ),分别代表学生的数目和操作的数目。
    学生ID编号分别从1编到N。
    第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩。
    接下来有M行。每一行有一个字符 C (只取'Q'或'U') ,和两个正整数A,B。
    当C为'Q'的时候,表示这是一条询问操作,它询问ID从A到B(包括A,B)的学生当中,成绩最高的是多少。
    当C为'U'的时候,表示这是一条更新操作,要求把ID为A的学生的成绩更改为B。

    输出

    对于每一次询问操作,在一行里面输出最高成绩。

    样例输入

    5 6
    1 2 3 4 5
    Q 1 5
    U 3 6
    Q 3 4
    Q 4 5
    U 2 9
    Q 1 5

    样例输出

    5
    6
    5
    9

    初次接触线段树,参考学习了大牛的代码收益匪浅!

    http://www.notonlysuccess.com/index.php/segment-tree-complete/

    maxn是题目给的最大区间,而节点数要开4倍,确切的来说节点数要开大于maxn的最小2x的两倍

    lson和rson分辨表示结点的左儿子和右儿子,由于每次传参数的时候都固定是这几个变量,所以可以用预定于比较方便的表示

    PushUP(int rt)是把当前结点的信息更新到父结点

    PushDown(int rt)是把当前结点的信息更新给儿子结点

    rt表示当前子树的根(root),也就是当前所在的结点

    #include <stdio.h>
    #include <iostream>
    using namespace std;
    
    #define lson l,m,rt << 1
    #define rson m+1,r,rt << 1 | 1
    const int MAXN=222222;
    
    int MAX[MAXN*4];
    void PushUP(int rt){
    	//使MAX数组存放当前结点区间的最大值 
    	MAX[rt]=max(MAX[rt<<1],MAX[rt<<1|1]);
    }
    void build(int l, int r, int rt){
    	if(l==r){
    		scanf("%d",&MAX[rt]);
    		return;
    	}
    	int m=(l+r)>>1;
    	build(lson);
    	build(rson);
    	PushUP(rt);	
    }
    
    void update(int p, int sc, int l, int r, int rt){
    	if(l==r){
    		MAX[rt]=sc;
    		return;
    	}
    	int m=(l+r)>>1;
    	if(p<=m)update(p,sc,lson);
    	else update(p,sc,rson);
    	PushUP(rt);
    }
    
    int query(int L, int R, int l, int r, int rt){
    	if(L<=l && r<=R){
    		return MAX[rt];
    	}
    	int m=(l+r)>>1;
    	int ret=0;
    	if(L<=m)ret=max(ret, query(L,R,lson));
    	if(R>m)ret=max(ret,query(L,R,rson));
    	return ret;
    }
    
    int main()
    {
    	int n,m;
    	while(~scanf("%d %d",&n ,&m)){
    		build(1,n,1);
    		while(m--){
    			char op[2];
    			int a,b;
    			scanf("%s%d%d",op,&a,&b);
    			if(op[0]=='Q'){
    				printf("%d
    ",query(a,b,1,n,1));
    			}else{
    				update(a,b,1,n,1);
    			}
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    反转链表 16
    CodeForces 701A Cards
    hdu 1087 Super Jumping! Jumping! Jumping!(动态规划)
    hdu 1241 Oil Deposits(水一发,自我的DFS)
    CodeForces 703B(容斥定理)
    poj 1067 取石子游戏(威佐夫博奕(Wythoff Game))
    ACM 马拦过河卒(动态规划)
    hdu 1005 Number Sequence
    51nod 1170 1770 数数字(数学技巧)
    hdu 2160 母猪的故事(睡前随机水一发)(斐波那契数列)
  • 原文地址:https://www.cnblogs.com/chenjianxiang/p/3535900.html
Copyright © 2011-2022 走看看