HDU 1754 I Hate It 线段树 最大值 点更新

来源:互联网 发布:星球大战顺序 知乎 编辑:程序博客网 时间:2024/05/16 01:28

原题: http://acm.hdu.edu.cn/showproblem.php?pid=1754

题目:

I Hate It

Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 51626 Accepted Submission(s): 20227

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

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

Input
本题目包含多组测试,请处理到文件结束。
在每个测试的第一行,有两个正整数 N 和 M ( 0

思路:

每次做的时候注意数组大小,还有想清楚查询函数的递归式里为什么不用更新l,r的值。注意递归的终点一定要可预料,否则跳不出递归。

代码:

#include <iostream>#include"cstdio"#include"string.h"#include"stdlib.h"using namespace std;const int N = 200050;struct node{    int l;    int r;    int maxn;};node tree[N*4];int a[N];void build(int id,int l,int r){    tree[id].l=l;    tree[id].r=r;    if(l==r)    {        tree[id].maxn=a[l];    }    else    {        int mid=(l+r)/2;        build(id*2,l,mid);        build(id*2+1,mid+1,r);        tree[id].maxn=max(tree[id*2].maxn,tree[id*2+1].maxn);    }}void update(int id,int pos,int val){    if(tree[id].l==tree[id].r)    {        tree[id].maxn=val;    }    else    {        int mid=(tree[id].l+tree[id].r)/2;        if(pos<=mid)            update(id*2,pos,val);        else            update(id*2+1,pos,val);        tree[id].maxn=max(tree[id*2].maxn,tree[id*2+1].maxn);    }}int Find(int id,int l,int r){    if(tree[id].l>=l&&tree[id].r<=r)        return tree[id].maxn;    else    {        int mid=(tree[id].l+tree[id].r)/2;        int ans=0;        if(l<=mid)            ans=max(ans,Find(id*2,l,r));        if(r>mid)            ans=max(ans,Find(id*2+1,l,r));        return ans;    }}void init(){    memset(a,0,sizeof(a));    memset(tree,0,sizeof(tree));}int main(){    init();    int n,m;    while(scanf("%d %d",&n,&m)!=EOF)    {        for(int j=1; j<=n; j++)        {            scanf("%d",&a[j]);        }        build(1,1,n);        char s[10];        for(int j=0; j<m; j++)        {            scanf("%s",s);            if(s[0]=='Q')            {                int p,q;                scanf("%d %d",&p,&q);                printf("%d\n",Find(1,p,q));            }            else if(s[0]=='U')            {                int p,q;                scanf("%d %d",&p,&q);                update(1,p,q);            }        }    }    return 0;}
0 0
原创粉丝点击