ural 1019 Line Painting (線段樹)

來源:互聯網
上載者:User

#include <cstdio>#include <cstring>#include <algorithm>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) a<b?a:b#define max(a,b) a>b?a:bstruct 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<b.n;}void build(int l ,int r ,int rt){    t[rt].l=l; t[rt].r=r; t[rt].cnt=0;    if(l+1==r) return ;    int mid=t[rt].mid();    build(l,mid,lch(rt));    build(mid,r,rch(rt));}void updata(int l ,int r ,int v ,int rt){    if(t[rt].cnt == v) return ; //剪枝    if(t[rt].l == l && t[rt].r == r)    {        t[rt].cnt=v;        return ;    }    if(t[rt].cnt!=-1) //當前節點是純色的,傳遞給它的孩子並且記錄其為不純色的    {        t[lch(rt)].cnt=t[rch(rt)].cnt=t[rt].cnt;        t[rt].cnt=-1;    }    int mid=t[rt].mid();    if(r<=mid)        updata(l,r,v,lch(rt));    else if(l>=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; i<m; i++)        updata(s[i].l , s[i].r , s[i].v , 1);     nc=0;    query(1); //統計出所有白色的線段//    for(int i=0; i<nc; i++) printf("[%d,%d]\n",c[i].l,c[i].r);    int maxlen=-1;    int len;    int resl,resr;    int l,r;    l=c[0].l; r=c[0].r;    for(int i=0; i<nc-1; i++)    {        if(c[i+1].l == c[i].r) //可以繼續合并一個區間            r=c[i+1].r;        else //第i+1個區間不能合并進來        {            len= p[r].n - p[l].n;            if(len>maxlen)            {                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<m; i++)        {            int l,r; char col[5];            scanf("%d%d%s",&l,&r,col);            s[i].v= (col[0]=='b')?1:0;            p[n].m=i;   p[n].f=0;   p[n].n=l;            p[n+1].m=i; p[n+1].f=1; p[n+1].n=r;            n+=2;        }        sort(p,p+n,cmp);        num=0;        for(int i=0; i<n; i++)        {            int mm=p[i].m;            if(i==0 || p[i].n!=p[i-1].n) p[num++]=p[i];            if(p[i].f) s[mm].r=num;            else       s[mm].l=num;        }//        for(int i=0; i<num; i++) printf("%d ",p[i].n); printf("\n");//        for(int i=0; i<m; i++) printf("[%d,%d] %d\n",s[i].l,s[i].r,s[i].v);        solve();    }    return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.