zoukankan      html  css  js  c++  java
  • HDU 1199 Color the Ball

    第一个离散化线段树
     
    先把区间写成左开右闭的形式,然后sort() unique() lower_bound() 离散化
    最后按普通线段树更新即可
     
    代码:
    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    using namespace std;
    #define for if(0); else for
    const int N=2010;

    struct Inteval{
        int l,r;
        char color;
        Inteval(){l=r=0,color='b';}
        Inteval(int l,int r){
            this->l=l;
            this->r=r;
            color='b';
        }
    };


    struct SegNode{
        int lc,rc,cc,pc;
        char empty,color;
        SegNode(){lc=rc=cc=pc=empty=color=0;}
    };

    struct SegTree{
        SegNode a[N<<2];
        int Q,len[N<<2];
        void Init(int n){
            for(Q=1;Q<=n+2;Q<<=1) ;
            memset(a,0,sizeof(a));
            memset(len,0,sizeof(len));
        }

        void update_len(int p,int l){
            p+=Q;
            while(p) len[p]+=l,p>>=1;
        }

        void update_node(int rt,int color){
            int v=color==1?len[rt]:0;
            a[rt].color=color;
            a[rt].lc=a[rt].rc=a[rt].cc=v;
            a[rt].pc=0;
        }

        SegNode merge(SegNode l,SegNode r,int llen,int rlen,int L)const {
            SegNode ret;
            ret.lc=l.lc;
            ret.rc=r.rc;
            ret.cc=l.cc;
            ret.pc=l.pc;
            if(l.rc+r.lc>ret.cc) ret.cc=l.rc+r.lc,ret.pc=llen-l.rc;
            if(r.cc>ret.cc) ret.cc=r.cc,ret.pc=r.pc+llen;
            if(l.lc==llen) ret.lc+=r.lc;
            if(r.rc==rlen) ret.rc+=l.rc;
            ret.color=l.color==r.color?l.color:-1;
            return ret;
        }

        void pushup(int rt,int llen,int rlen,int L){
            a[rt]=merge(a[rt<<1],a[rt<<1|1],llen,rlen,L);
        }
        void pushdown(int rt,int llen,int rlen,int L){
            if(a[rt].color!=-1){
                a[rt<<1].color=a[rt<<1|1].color=a[rt].color;
                update_node(rt<<1,a[rt].color);
                update_node(rt<<1|1,a[rt].color);
            }
        }

        void update(int L,int R,int l,int r,int rt,int color){
            int m=(l+r)>>1;
            if(L<=l && r<=R){
                update_node(rt,color);
                return;
            }
            if(rt>=Q) return;
            pushdown(rt,len[rt<<1],len[rt<<1|1],r-l+1);
            if(L<=m) update(L,R,l,m,rt<<1,color);
            if(m<R) update(L,R,m+1,r,rt<<1|1,color);
            pushup(rt,len[rt<<1],len[rt<<1|1],r-l+1);
        }

    }st;


    Inteval inteval[N];
    int tmp[N<<1],tmpcnt;
    int n;




    int main() {
        while(scanf("%d",&n)!=EOF){
            for(int i=0;i<n;i++) scanf(" %d %d %c",&inteval[i].l,&inteval[i].r,&inteval[i].color);
            tmpcnt=0;
            for(int i=0;i<n;i++) tmp[tmpcnt++]=inteval[i].l,tmp[tmpcnt++]=inteval[i].r+1;
            sort(tmp,tmp+tmpcnt);
            tmpcnt=unique(tmp,tmp+tmpcnt)-tmp;
            st.Init(tmpcnt);
            for(int i=1;i<tmpcnt;i++) st.update_len(i-1,tmp[i]-tmp[i-1]);
            for(int i=0;i<n;i++){
                int l=lower_bound(tmp,tmp+tmpcnt,inteval[i].l)-tmp;
                int r=lower_bound(tmp,tmp+tmpcnt,inteval[i].r+1)-tmp-1;
                int color=inteval[i].color=='w';
                st.update(l,r,0,st.Q-1,1,color);
            }
            int ans1=st.a[1].pc+tmp[0];
            int ans2=ans1+st.a[1].cc-1;
            if(ans2>0) printf("%d %d\n",ans1,ans2);
            else printf("Oh, my god\n");
        }
        return 0;
    }
  • 相关阅读:
    【win7】安装开发环境
    【php-fpm】启动PHP报错ERROR: [pool www] cannot get uid for user 'apache'
    【apache2】AH00543: httpd: bad user name apache
    【gedit】 显示行号
    关于golang.org/x包问题
    国内的go get问题的解决
    php7函数,声明,返回值等新特性介绍
    php5.6.x到php7.0.x特性
    PHP5.4.0新特性研究
    【git】如何去解决fatal: refusing to merge unrelated histories
  • 原文地址:https://www.cnblogs.com/programCaiCai/p/HDU1199.html
Copyright © 2011-2022 走看看