hdu 4819 Mosaic (二维线段树)

来源:互联网 发布:java开发实战经典源码 编辑:程序博客网 时间:2024/05/16 07:23

大哭大哭大哭  T到死。多了一个更新第一维的函数。多了一个logn的复杂度。


其实后来看了题解以后知道  更新一维可以直接在建立二维的时候就完成。再加入就是多此一举了。


其中的pushupy是多余的。。。

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#define maxn 805#define inf 0x3f3f3f3fusing namespace std;int Min[maxn*3][maxn*3];int Max[maxn*3][maxn*3];int ansmin,ansmax;int n;inline int ReadInt(){    char ch = getchar();    int data = 0;    while (ch < '0' || ch > '9')    {        ch = getchar();    }    do    {        data = data*10 + ch-'0';        ch = getchar();    }while (ch >= '0' && ch <= '9');        return data;}inline void pushupx(int pos,int num){    Min[pos][num]=Min[pos][num<<1]>Min[pos][num<<1|1]?Min[pos][num<<1|1]:Min[pos][num<<1];    Max[pos][num]=Max[pos][num<<1]>Max[pos][num<<1|1]?Max[pos][num<<1]:Max[pos][num<<1|1];}inline void pushupy(int pos,int num,int s,int e){    Min[pos][num]=Min[pos<<1][num]<Min[pos<<1|1][num]?Min[pos<<1][num]:Min[pos<<1|1][num];    Max[pos][num]=Max[pos<<1][num]>Max[pos<<1|1][num]?Max[pos<<1][num]:Max[pos<<1|1][num];    if(s==e)        return;    int mid=(s+e)>>1;    pushupy(pos,num<<1,s,mid);    pushupy(pos,num<<1|1,mid+1,e);}void buildx(int pos,int num,int s,int e,int rt){    if(s==e)    {        if(rt==-1){            int a;            a=ReadInt();            Max[pos][num]=Min[pos][num]=a;        }        else        {            Min[pos][num]=min(Min[pos<<1][num],Min[pos<<1|1][num]);            Max[pos][num]=max(Max[pos<<1][num],Max[pos<<1|1][num]);        }        return;    }    int mid=(s+e)>>1;    buildx(pos,num<<1,s,mid,rt);    buildx(pos,num<<1|1,mid+1,e,rt);    pushupx(pos,num);}void buildy(int num,int s,int e){    if(s==e)    {        buildx(num,1,1,n,-1);        return;    }    int mid=(s+e)>>1;    buildy(num<<1,s,mid);    buildy(num<<1|1,mid+1,e);    buildx(num,1,1,n,1);}void queryx(int pos,int num,int s,int e,int l,int r){    if(l<=s && r>=e)    {        ansmin=Min[pos][num]<ansmin?Min[pos][num]:ansmin;        ansmax=Max[pos][num]>ansmax?Max[pos][num]:ansmax;        return ;    }    int mid=(s+e)>>1;    if(r<=mid)queryx(pos,num<<1,s,mid,l,r);    else if(l>mid)queryx(pos,num<<1|1,mid+1,e,l,r);    else    {        queryx(pos,num<<1,s,mid,l,mid);        queryx(pos,num<<1|1,mid+1,e,mid+1,r);    }}void queryy(int num,int s,int e,int l,int r,int u,int d){    if(l<=s && r>=e)    {        queryx(num,1,1,n,u,d);        return;    }    int mid=(s+e)>>1;    if(r<=mid)queryy(num<<1,s,mid,l,r,u,d);    else if(l>mid)queryy(num<<1|1,mid+1,e,l,r,u,d);    else    {        queryy(num<<1,s,mid,l,mid,u,d);        queryy(num<<1|1,mid+1,e,mid+1,r,u,d);    }}void updatex(int pos,int num,int s,int e,int p,int val,int rt){    if(s==e)    {        if(rt!=-1){            Min[pos][num]=Max[pos][num]=val;        }        else        {            Min[pos][num]=min(Min[pos<<1][num],Min[pos<<1|1][num]);            Max[pos][num]=max(Max[pos<<1][num],Max[pos<<1|1][num]);        }        return;    }    int mid=(s+e)>>1;    if(p<=mid)updatex(pos,num<<1,s,mid,p,val,rt);    else updatex(pos,num<<1|1,mid+1,e,p,val,rt);    pushupx(pos,num);}void updatey(int num,int s,int e,int posy,int posx,int val){    if(s==e)    {        updatex(num,1,1,n,posx,val,1);        return;    }    int mid=(s+e)>>1;    if(posy<=mid)updatey(num<<1,s,mid,posy,posx,val);    else updatey(num<<1|1,mid+1,e,posy,posx,val);    updatex(num,1,1,n,posx,val,-1);}int main(){    int T;    T=ReadInt();    for(int cas=1;cas<=T;cas++)    {        printf("Case #%d:\n",cas);        n=ReadInt();        buildy(1,1,n);        int m;        m=ReadInt();        while(m--)        {            int r,l,siz;            r=ReadInt();            l=ReadInt();            siz=ReadInt();            siz/=2;            int up,down,left,right;            up=1>r-siz?1:r-siz;            down=n<r+siz?n:r+siz;            left=1>l-siz?1:l-siz;            right=n<l+siz?n:l+siz;            if(up>down)                swap(up,down);            if(left>right)                swap(left,right);            ansmin=inf;            ansmax=-1;            queryy(1,1,n,up,down,left,right);            updatey(1,1,n,r,l,(ansmin+ansmax)/2);            printf("%d\n",(ansmin+ansmax)/2);        }    }    return 0;}


1 0