hdu 1698 分类: hdu 2015-03-06 21:55 33人阅读 评论(0) 收藏

hdu 1689


线段树区间染色,听说用map可以水过去。


#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>

const int MAXN = 1000005;

int tree[MAXN<<2];

int n , q;

int tot;

inline void fold_down(const int si)
{
    if(tree[si] != false)
      tree[si<<1] = tree[(si<<1)|1] = tree[si];

    tree[si] =  false;
}

inline void update(const int &v,const int l,const int r,const int ll,const int rr,const int si)
{
    if(l == ll && r == rr)
    {
       fold_down(si);    

       tree[si] = v;    
    }
    else
    {
        int mid = (ll + rr)>>1;

        fold_down(si);

        if(r <= mid)      update(v,l,r,ll,mid,si<<1);
        else if(l > mid)  update(v,l,r,mid+1,rr,(si<<1)|1);
        else
        {
            update(v,l,mid,ll,mid,(si<<1));
            update(v,mid+1,r,mid+1,rr,(si<<1)|1);
        }
    }

}

inline void count(const int ll,const int rr,const int si)
{
    if(ll == rr)
    {
        tot += tree[si];
    }
    else
    {
        int mid = (ll + rr)>>1;

        fold_down(si);

        count(ll,mid,si<<1);
        count(mid+1,rr,(si<<1)|1);
    }

}
int main()
{
    int T , num=0;

#ifndef ONLINE_JUDGE    
    freopen("hdu1698.in","r",stdin);
    freopen("hdu1698.out","w",stdout);
#endif

     scanf("%d",&T);

     while(T--)
     {
         ++ num;

         memset(tree,0,sizeof(tree));

        scanf("%d",&n);    

          tree[1] = 1;

          scanf("%d",&q);

          while(q--)
          {
              int a , b , c;

              scanf("%d%d%d",&a,&b,&c);

              update(c,a,b,1,n,1);
          }

         tot=0;

         count(1,n,1);

         printf("Case %d: The total value of the hook is %d.\n",num,tot);
     }



#ifndef ONLINE_JUDGE
    fclose(stdin);
    fclose(stdout); 
#endif
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

posted @ 2015-03-06 21:55  <Dash>  阅读(111)  评论(0编辑  收藏  举报