HDU 1199 Color the Ball

这题真的过的好艰辛啊,自己的方法是不对的,参考了某个大神的博客,然后修改自己的代码才通过。对于各个区间的交叉之类的还不是很会啊,尚需努力。。。。

参考:大神博客

线段树真的写的好挫啊,,,,,无力吐槽了。。。 

题意是对 一些气球染色,然后输出最长的且最近的那个染成白色的连续区间

#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
#define LL(x) x<<1
#define RR(x) x<<1|1
int num[4005], bin[4005], ans[4005];
struct Op
{
    int l, r, va;
} op[2005];
int xx;
struct Node
{
    int l, r, p, va;
} T[4005<<2];
void PushDown(int p)
{
    if(T[p].va!=-1)
    {
        T[LL(p)].va=T[RR(p)].va=T[p].va;
        T[p].va=-1;
    }
}
void build(int p,int l,int r)
{
    if(l>=r) return;
    T[p].l=l;
    T[p].r=r;
    T[p].va=-1;
    if(l==r-1)
        return;
    int m=(l+r)>>1;
    build(LL(p),l,m);
    build(RR(p),m,r);
}
void add(int p,int l,int r,int va)
{
    if(l>=r) return;
    if(l==T[p].l&&T[p].r==r)
    {
        T[p].va=va;
        return;
    }
    PushDown(p);
    int m=(T[p].l+T[p].r)>>1;
    if(l>=m) add(RR(p),l,r,va);
    else if(r<=m) add(LL(p),l,r,va);
    else
    {
        add(LL(p),l,m,va);
        add(RR(p),m,r,va);
    }
}
int find(int x)
{
    int l=1, r=xx;
    while(l<=r)
    {
        int m=(l+r)>>1;
        if(bin[m]==x)
        {
            return m;
        }
        if(bin[m]>x)
            r=m-1;
        else l=m+1;
    }
    return -1;
}
void get(int p,int l,int r)
{
    int i;
    if(l>=r) return;
    if(T[p].va!=-1)
    {
        for(i=T[p].l; i<T[p].r; i++)
            ans[i]=T[p].va;
        return;
    }
    int m=(T[p].l+T[p].r)>>1;
    if(l>=m)
        get(RR(p),l,r);
    else if(r<=m)
        get(LL(p),l,r);
    else
    {
        get(LL(p),l,m);
        get(RR(p),m,r);
    }
}
int main()
{
    int n, i, st, ed, len;
    char s[3];
    while(scanf("%d",&n)!=EOF)
    {
        len=0;
        for(i=0; i<n; i++)
        {
            scanf("%d%d%s",&st,&ed,s);
            ed++;
            op[i].l=st, op[i].r=ed;
            if(s[0]=='w') op[i].va=1;
            else op[i].va=0;
            num[len++]=st;
            num[len++]=ed;
        }
        sort(num,num+len);
        xx=1;
        bin[1]=num[0];
        for(i=1; i<len; i++)
        {
            if(num[i]!=num[i-1])
                bin[++xx]=num[i];
        }
        build(1,1,xx);
        for(i=0; i<n; i++)
        {
            int h1=find(op[i].l), h2=find(op[i].r);
            add(1,h1,h2,op[i].va);
        }
        memset(ans,0,sizeof(ans));
        get(1,1,xx);
        ans[xx+1]=0, bin[xx+1]=bin[xx];
        int y1=0, y2=0;
        for(i=1; i<=xx; i++)
        {
            if(ans[i]!=1) continue;
            st=bin[i];
            while(ans[i]==1) i++;
            ed=bin[i];
            if(ed-st>y2-y1)
                y2=ed, y1=st;
        }
        if(y2-y1!=0) printf("%d %d\n",y1,y2-1);
        else printf("Oh, my god\n");
    }
    return 0;
}


posted @ 2013-08-16 00:01  Ink_syk  阅读(98)  评论(0编辑  收藏  举报