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;
    }
    
  • 相关阅读:
    OpenCR 固件修复
    E-PUCK2机器人-固件更新
    E-puck2机器人系列教程-2.软件的安装与使用
    E-PUCK2机器人-硬件
    E-puck2机器人系列教程-固件修复升级
    GridView
    TimePicker 和TimePickerDiag
    android中实现简单的播放
    ListView的使用
    android的activity的跳转
  • 原文地址:https://www.cnblogs.com/chenjianxiang/p/3535900.html
Copyright © 2011-2022 走看看