POJ3368

傳送門:POJ3368

注意到不降,於是序列一定是連續的。
然後就是傻逼題了。
代碼上的小細節見下。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;

struct Node{
    int ls,rs;
    int lw,rw,w;
};

int root,num;
Node tree[1000005];
int da[1000005];
int y1,y2;
int n,m;

void MakeTree(int& root,int l,int r)
{
    root=++num;
    if(l==r){
        tree[root].lw=tree[root].rw=tree[root].w=1;
        return;
    }
    int mid=(l+r)/2;
    MakeTree(tree[root].ls,l,mid);
    MakeTree(tree[root].rs,mid+1,r);
    if(da[mid]==da[mid+1]){
        if(mid-l+1==tree[tree[root].ls].lw)
            tree[root].lw=tree[tree[root].ls].lw+tree[tree[root].rs].lw;
        else
            tree[root].lw=tree[tree[root].ls].lw;
        if(r-mid==tree[tree[root].rs].rw)
            tree[root].rw=tree[tree[root].rs].rw+tree[tree[root].ls].rw;
        else
            tree[root].rw=tree[tree[root].rs].rw;
        tree[root].w=max(max(tree[tree[root].ls].w,tree[tree[root].rs].w),tree[tree[root].ls].rw+tree[tree[root].rs].lw);
    }
    else{
        tree[root].lw=tree[tree[root].ls].lw;
        tree[root].rw=tree[tree[root].rs].rw;
        tree[root].w=max(tree[tree[root].ls].w,tree[tree[root].rs].w);
    }
}

void Debug(int root,int l,int r)
{
    printf("%d %d %d %d %d\n",l,r,tree[root].w,tree[root].lw,tree[root].rw);
    if(l==r)
        return;
    int mid=(l+r)/2;
    Debug(tree[root].ls,l,mid);
    Debug(tree[root].rs,mid+1,r);
}

int Query(int root,int l,int r,int& lw,int& rw)
{
    if(y1<=l&&r<=y2){
        lw=tree[root].lw;
        rw=tree[root].rw;
        return tree[root].w;
    }
    int mid=(l+r)/2;
    int ans1,ans2;
    int lw1,lw2,rw1,rw2;
    if(y1<=mid)
        ans1=Query(tree[root].ls,l,mid,lw1,rw1);
    else
        ans1=0,lw1=0,rw1=0;
    if(mid<y2)
        ans2=Query(tree[root].rs,mid+1,r,lw2,rw2);
    else
        ans2=0,lw2=0,rw2=0;
    if(da[mid]==da[mid+1]){
        if(mid-l+1==lw1)
            lw=lw1+lw2;
        else
            lw=lw1;
        if(r-mid==rw2)
            rw=rw1+rw2;
        else
            rw=rw2;
        return max(max(ans1,ans2),rw1+lw2);
    }
    lw=lw1;rw=rw2;
    return max(ans1,ans2);
}

void Solve()
{
    while(scanf("%d%d",&n,&m)==2){
        int c,d;
        for(int i=1;i<=n;i++)
            scanf("%d",&da[i]);
        MakeTree(root,1,n);
        for(int i=1;i<=m;i++){
            scanf("%d%d",&y1,&y2);
            if(y1>y2)
                swap(y1,y2);
            printf("%d\n",Query(1,1,n,c,d));
        }
        root=0,num=0;
        for(int i=1;i<=2*n;i++)
            tree[i].ls=tree[i].rs=0;
    }
}

void Readdata()
{
    freopen("loli.in","r",stdin);
}

void Close()
{
    fclose(stdin);
    fclose(stdout);
}

int main()
{
    Readdata();
    //Debug(1,1,n);
    Solve();
    Close();
    return 0;
}
發佈了54 篇原創文章 · 獲贊 5 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章