训练之线段树I Hate It

来源:互联网 发布:太阳能热水器 知乎 编辑:程序博客网 时间:2024/06/03 17:24

I Hate ItCrawling in process...Crawling failedTime Limit:3000MS    Memory Limit:32768KB    64bit IO Format:%I64d & %I64u



Hint

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 6
1 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<stdio.h>#define MAX 4000000int n,m,ans,cnt;int a[200010];struct stree{//线段树    int l,r,ma;}tree[MAX];int Max(int a,int b){    return a>b?a:b;}void btree(int l,int r,int t){//构建线段树    int x;    tree[t].l=l;    tree[t].r=r;    tree[t].ma=0;    if(l==r){        while(t){            if(tree[t].ma<a[l])                tree[t].ma=a[l];            t/=2;        }        return ;    }    x=(l+r)/2;    btree(l,x,2*t);    btree(x+1,r,2*t+1);}void utree(int l,int r,int t){//更新线段树    int x;    if(tree[t].l==l&&tree[t].r==r){        tree[t].ma=cnt;        while(t){            t/=2;            tree[t].ma=Max(tree[2*t].ma,tree[2*t+1].ma);        }        return ;    }    x=(tree[t].l+tree[t].r)/2;    if(x>=r)    utree(l,r,2*t);    else if(x<l) utree(l,r,2*t+1);    else{        utree(l,x,2*t);        utree(x+1,r,2*t+1);    }}void qtree(int l,int r,int t){//访问线段树    if(tree[t].l==l&&tree[t].r==r){        if(ans<tree[t].ma)            ans=tree[t].ma;        return ;    }    int x;    x=(tree[t].l+tree[t].r)/2;    if(x>=r)    qtree(l,r,2*t);    else if(x<l) qtree(l,r,2*t+1);    else{        qtree(l,x,2*t);        qtree(x+1,r,2*t+1);    }}int main(){    int i,j;    while(~scanf("%d%d",&n,&m)&&n!=0){        for(i=1;i<=n;i++)            scanf("%d",&a[i]);        btree(1,n,1);        for(j=0;j<m;j++){            char str[10];            int l,r;            scanf("%s",str);            scanf("%d%d",&l,&r);            if(str[0]=='Q'){                ans=0;                qtree(l,r,1);                printf("%d\n",ans);            }            if(str[0]=='U'){                cnt=r;                utree(l,l,1);            }        }    }    return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 一年级小孩基础差怎么办 一年级小孩语文差怎么办 一年级小孩数学差怎么办 一年级小孩理解能力差怎么办 一年级小孩作文差怎么办 一年级小孩记忆力差怎么办 孩子的记忆力不好怎么办 孩子记忆力不好怎么办呢 小学三年级学生不听话怎么办 司法考试成绩单没打印怎么办 高一200分怎么办 初一孩子语文差怎么办 大学专业没选好怎么办 减肥口渴的厉害怎么办 开胸手术后胸闷气短怎么办 打游戏上网成瘾怎么办 老公打游戏成瘾怎么办 我老是沉迷游戏怎么办 18孩子沉迷游戏怎么办 志愿提交码丢失怎么办 幼儿园报名没进怎么办 考完教师资格证怎么办 两套房改房怎么办 cad打开无响应怎么办 高中生脸上痘痘怎么办 孩子玩心太大怎么办 开会听不懂讲什么怎么办 在国外玩手游老是进不去怎么办 广东普法考试不合格怎么办 尔雅考试错过了怎么办 大四考试错过了怎么办 电大考试错过了怎么办 吃了桂圆咳嗽怎么办 初中生游戏网瘾怎么办 孩子染上网瘾怎么办 郑州孩子厌学有网瘾怎么办 孩子网瘾严重怎么办 学生上课玩手机怎么办 老脱发怎么办才好 好几个月不来月经怎么办 电脑辐射脸上起痘痘怎么办