ural 1019 Line Painting (线段树)


#include 
#include 
#include 
using namespace std;
#define MAX 1000000000
#define N 10010
#define M 5010
#define lch(i) ((i)<<1)
#define rch(i) ((i)<<1|1)
#define min(a,b) ab?a:b

struct point{
    int m,f,n;
}p[N];
struct segment{
    int l,r,v;
}s[M];
struct tree{
    int l,r,cnt;
    int mid()
    { return (l+r)>>1; }
}t[4*N];
int m,num;

struct ran{
    int l,r;
}c[N];
int nc;

int cmp(struct point a ,struct point b)
{
    return a.n=mid)
        updata(l,r,v,rch(rt));
    else
    {
        updata(l,mid,v,lch(rt));
        updata(mid,r,v,rch(rt));
    }
}

void query(int rt)
{
    if(t[rt].cnt==1) //该区间全部是黑色的没必要再继续下去
        return ;
    if(t[rt].cnt==0) //该区间全部是白色的没必要继续下去,直接记录
    {
        c[nc].l=t[rt].l-1;
        c[nc].r=t[rt].r-1;
        nc++;
        return ;
    }
    if(t[rt].l+1==t[rt].r) return ;
    //剩下的情况就是为-1的情况无法确定的
    query(lch(rt));
    query(rch(rt));
}

void solve()
{
    build(1,num,1);
    for(int i=0; imaxlen)
            {
                maxlen=len;
                resl=l;
                resr=r;
            }
            l=c[i+1].l;
            r=c[i+1].r;
        }
    }
    len= p[r].n - p[l].n;
    if(len>maxlen)
    { resl=l; resr=r; }
    printf("%d %d\n",p[resl].n , p[resr].n);
}

int main()
{
    while(scanf("%d",&m)!=EOF)
    {
        m++;
        s[0].v=0;
        p[0].f=0; p[0].m=0; p[0].n=0;
        p[1].f=1; p[1].m=0; p[1].n=MAX;
        int n=2;
        for(int i=1; i


你可能感兴趣的:(Ural,线段树)