HUD_1745 I Hate It!【线段树】【最值查询修改】

来源:互联网 发布:域名系统dns的作用 编辑:程序博客网 时间:2024/05/17 00:04

Problem Description:

   很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少这让很多学生很反感。不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。

Input:

本题目包含多组测试,请处理到文件结束。在每个测试的第一行,有两个正整数 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。

Output:

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

Sample Input:

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

Sample Output:

5659

Hint:

Huge input,the C function scanf() will work better than cin

#include <iostream>#include <algorithm>#include <cstring>#define MAX 200000using namespace std;struct Tree{    int l;    int r;    int v;};Tree tree[MAX << 2];void pushup(int rt){ //在所有更改节点值的操作后记得pushup。    tree[rt].v = max(tree[rt << 1].v , tree[rt << 1 | 1].v);}void  Buildtree(int l, int r, int rt){    tree[rt].l = l;    tree[rt].r = r;    if(r == l){        scanf("%d", &tree[rt].v);        return;    }    int mid = (l + r) >> 1;    Buildtree(l, mid, rt << 1);    Buildtree(mid + 1, r, rt << 1 | 1);    pushup(rt);}void updata( int rt, int k, int i){    if(tree[rt].l == tree[rt].r){ //更新到叶子结点听就可以了,显而易见这个节点一定是被查询的节点        tree[rt].v = i;        return;        //cout << "tree[" << rt << "].v : " << i << endl;    }    int mid = (tree[rt].l + tree[rt].r) >> 1;    if(k <= mid) //这个查询节点如果在区间左半边就去左半边找  要么就去右半边        updata(rt << 1, k, i);    else        updata(rt << 1 | 1, k, i);    pushup(rt);//因为更改了数值所以pushup一下}int quary( int l, int  r, int rt ){    if(l <= tree[rt].l && tree[rt].r <= r){ //注意这里的包含关系 自己傻逼的写反了。        return tree[rt].v;    }    int maxn = 0;//这个maxn要在这里写。在外面不知道可不可以    int mid = (tree[rt].r + tree[rt].l) >> 1;    //注意这里的写法。    if(l <= mid) //左区间未覆盖完       maxn = max(quary(l, r, rt << 1), maxn);    if(r > mid) //右区间未覆盖完       maxn = max(quary(l, r, rt << 1 | 1), maxn);    return maxn;//要有返回值}int main() {    int n,q;    while(~scanf("%d %d", &n, &q)){        Buildtree(1, n, 1);        for(int i = 0; i < q; i++){            char c;            int a,b;            scanf("%s %d %d",&c, &a, &b);            //cout << " " << c << " " << a << " " <<b <<endl;            if(c == 'Q'){                printf("%d\n", quary(a, b, 1));            }            else if(c == 'U'){                updata( 1, a, b);            }        }    }    return 0;}/* 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 */
0 0
原创粉丝点击