UVA - 11235 Frequent values 线段树 区间合并

来源:互联网 发布:淘宝男装货到付款 编辑:程序博客网 时间:2024/06/06 00:41

查Bug到凌晨系列,下次一定要写仔细呀。

传送门:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=23846

#include <cstdio>#include <cstring>#include <stack>#include <queue>#include <iostream>#include <algorithm>#include <map>#include <vector>using namespace std;const int MAXN = 100005;struct Node {    int x,y;    int maxlen;    int llen,rlen;}t[MAXN<<2];int a[MAXN];void Push_Up(int rt) {    //Update maxlen;    t[rt].maxlen = max(t[rt<<1].maxlen,t[rt<<1|1].maxlen);    if(a[t[rt<<1].y] == a[t[rt<<1|1].x])t[rt].maxlen = max(t[rt].maxlen,t[rt<<1].rlen+t[rt<<1|1].llen);    //Update llen;    t[rt].llen = t[rt<<1].llen;    if(t[rt<<1].llen == t[rt<<1].y - t[rt<<1].x + 1 && a[t[rt<<1].y] == a[t[rt<<1|1].x])         t[rt].llen += t[rt<<1|1].llen;    //Update rlen;    t[rt].rlen = t[rt<<1|1].rlen;    if(t[rt<<1|1].rlen == t[rt<<1|1].y - t[rt<<1|1].x + 1 && a[t[rt<<1].y] == a[t[rt<<1|1].x])         t[rt].rlen += t[rt<<1].rlen;}void Build(int x,int y,int  rt) {    t[rt].x = x; t[rt].y = y;     if(x == y) {        t[rt].maxlen = 1;        t[rt].llen = 1;        t[rt].rlen = 1;        return ;    }    int mid = (x + y) >> 1;    Build(x,mid,rt<<1);    Build(mid+1,y,rt<<1|1);    Push_Up(rt);}int p;//Last right ;int ans ;int tempright;int tempans;void Query(int x,int y,int rt,int Left,int Right) {    if(x >= Left && y <= Right) {        //Update tempans;        //printf("x : %d y : %d\n",x,y);        tempans = t[rt].maxlen;        //printf("x : %d y : %d maxlen : %d Tempans : %d\n",t[rt].x,t[rt].y,t[rt].maxlen,tempans);        //printf("tempright : %d\n",tempright);        if(a[x] == a[p]) {            //puts("Hello");            //printf("p : %d a[p] : %d\n",p,a[p]);            //printf("x : %d\n",x);            tempans = max(tempans,tempright+t[rt].llen);            //printf("Tempans : %d\n",tempans);        }        //printf("Tempans : %d\n",tempans);        //Update ans;        ans = max(ans,tempans);        //Update tempright;        if(t[rt].rlen < y - x + 1) tempright = t[rt].rlen;        else {            if(a[x] == a[p]) {                tempright += t[rt].rlen;            }            else                 tempright = t[rt].rlen;            //Important !!!!!!!        }         //printf("tempright : %d\n",tempright);        //Update p;        p = y;        return ;    }    int mid = (x + y) >> 1;    if(mid >= Left ) Query(x,mid,rt<<1,Left,Right);    if(mid <  Right) Query(mid+1,y,rt<<1|1,Left,Right);}void print(int x,int y,int rt){    printf("Left : %d Right : %d maxlen : %d llen : %d rlen : %d\n",x,y,t[rt].maxlen,t[rt].llen,t[rt].rlen);    if(x == y) return ;    int mid = ( x + y ) >> 1;    print(x,mid,rt<<1);    print(mid+1,y,rt<<1|1);}void Deal_with() {    int n,q;    while(scanf("%d",&n),n) {        memset(t,0,sizeof(t));        scanf("%d",&q);        for(int i = 1 ; i <= n ; i++) {            scanf("%d",a+i);          //  printf("%d ",a[i]);        }        //puts("");        Build(1,n,1);        //print(1,n,1);        int tempa,tempb;        for(int i = 1 ; i <= q ; i++) {            ans = 0; tempans = 0;tempright = 0;            scanf("%d %d",&tempa,&tempb);            //printf("%d %d\n",tempa,tempb);            p = tempa;            Query(1,n,1,tempa,tempb);            printf("%d\n",ans);        }    }}int main(void) {    //freopen("a.in","r",stdin);    //freopen("out.txt","w",stdout);    Deal_with();}


0 0