HDU 1754 I Hate It(線段樹模版)

晚上覆習一下線段樹...結果還是搞了20分鐘才ac...萬惡的cin最好不要用了 可能超時

題目鏈接 點擊打開鏈接


代碼:

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

<strong><span style="font-size:18px;color:#ff6600;">#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define N 200005
struct 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>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章