HDU 1754 I Hate It(线段树模版)

来源:互联网 发布:身材测算软件 编辑:程序博客网 时间:2024/05/21 17:43

晚上复习一下线段树...结果还是搞了20分钟才ac...万恶的cin最好不要用了 可能超时

题目链接 点击打开链接


代码:

直接模版就行了,在build,update时更新最大值就好了

<strong><span style="font-size:18px;color:#ff6600;">#include<iostream>#include<cstdio>#include<algorithm>using namespace std;#define N 200005struct node{    int l,r,n;} a[3*N];  //最好开到3倍int s[N];void build(int l,int r,int i){    a[i].l=l;    a[i].r=r;    if(l==r)    {        a[i].n=s[l];  //找到叶子结点,更新        return;    }    int mid=(l+r)/2;    build(l,mid,2*i);    build(mid+1,r,2*i+1);    a[i].n=max(a[2*i].n,a[2*i+1].n); //更新最大值}void update(int l,int r,int i){    if(a[i].l==l&&a[i].r==l)    {        a[i].n=r;        return;    }    int mid=(a[i].l+a[i].r)/2;    if(l<=mid)        update(l,r,2*i);    else        update(l,r,2*i+1);    a[i].n=max(a[2*i].n,a[2*i+1].n); //更新最大值}int query(int l,int r,int i){    if(a[i].l==l&&a[i].r==r)    {        return a[i].n;    }    int mid=(a[i].l+a[i].r)/2;    if(r<=mid)        return query(l,r,2*i);    else if(l>mid)        return query(l,r,2*i+1);    else        return max(query(l,mid,2*i),query(mid+1,r,2*i+1));}int main(){    int n,m,i;    while(~scanf("%d%d",&n,&m)) //不要用cin...比赛各种超时    {        for(i=1; i<=n; i++)            cin>>s[i];        build(1,n,1);        while(m--)        {            getchar();  //这个小玩意不要忘了 要不会把回车读进去..            char o;int x,y;            scanf("%c%d%d",&o,&x,&y);            if(o=='Q')                cout<<query(x,y,1)<<endl;            else                update(x,y,1);        }    }}</span></strong>


0 0
原创粉丝点击