hdu 4614 Vases and Flowers(线段树:成段更新)

    线段树裸题。自己写复杂了,准确说是没想清楚就敲了。

    先是建点为已插花之和,其实和未插花是一个道理,可是开始是小绕,后来滚雪球了,跪了。

    重新建图,分解询问1为:找出真正插画的开始点和终止点,做成段更新。

    再次向notonlysuccess大神致谢,清晰的代码+清晰的思路=ac

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<algorithm>
  4 using namespace std;
  5 
  6 #define lson l,m,rt<<1
  7 #define rson m+1,r,rt<<1|1
  8 
  9 const int MAXN=55555;
 10 int sum[MAXN<<2];
 11 int lag[MAXN<<2];
 12 int n;
 13 
 14 void PushUp(int rt)
 15 {
 16     if(lag[rt<<1]==lag[rt<<1|1]&&lag[rt<<1]!=-1)
 17         lag[rt]=lag[rt<<1];
 18     else
 19         lag[rt]=-1;
 20     sum[rt]=sum[rt<<1]+sum[rt<<1|1];
 21 }
 22 
 23 void PushDown(int rt,int m)
 24 {
 25     if(lag[rt]!=-1){
 26         lag[rt<<1]=lag[rt<<1|1]=lag[rt];
 27         sum[rt<<1]=(m-(m>>1))*(1-lag[rt]);
 28         sum[rt<<1|1]=(m>>1)*(1-lag[rt]);
 29         lag[rt]=-1;
 30 
 31     }
 32 }
 33 
 34 void Build(int l,int r,int rt)
 35 {
 36     lag[rt]=-1;
 37     if(l==r){
 38         sum[rt]=1;
 39         return ;
 40     }
 41     int m=(l+r)>>1;
 42     Build(lson);
 43     Build(rson);
 44     PushUp(rt);
 45 }
 46 
 47 void updata(int L,int R,int c,int l,int r,int rt)
 48 {
 49     if(L<=l&&r<=R){
 50         sum[rt]=(r-l+1)*(1-c);
 51         lag[rt]=c;
 52         return ;
 53     }
 54     PushDown(rt,r-l+1);
 55     int m=(l+r)>>1;
 56     if(L<=m)updata(L,R,c,lson);
 57     if(m<R)updata(L,R,c,rson);
 58     PushUp(rt);
 59 }
 60 
 61 int Query1(int L,int R,int l,int r,int rt)
 62 {
 63     if(L>R)
 64         return 0;
 65     if(L<=l&&r<=R)
 66         return sum[rt];
 67     PushDown(rt,r-l+1);
 68     int m=(l+r)>>1;
 69     int res=0;
 70     if(L<=m)
 71         res+=Query1(L,R,lson);
 72     if(m<R)
 73         res+=Query1(L,R,rson);
 74     return res;
 75 }
 76 
 77 int Query2(int p,int l,int r,int rt)
 78 {
 79     if(l==r)
 80         return l;
 81     PushDown(rt,r-l+1);
 82     int m=(l+r)>>1;
 83     if(p<=sum[rt<<1])
 84         return Query2(p,lson);
 85     else
 86         return Query2(p-sum[rt<<1],rson);
 87 }
 88 int main()
 89 {
 90     int T,m;
 91     int op,a,b,k;
 92     int flag=0;
 93     scanf("%d",&T);
 94     while(T--)
 95     {
 96         scanf("%d%d",&n,&m);
 97 
 98         Build(0,n-1,1);
 99 
100         for(k=0;k<m;k++)
101         {
102             scanf("%d%d%d",&op,&a,&b);
103 
104             if(op==1){
105                 int s=Query1(a,n-1,0,n-1,1);
106                 if(!s)
107                     printf("Can not put any one.\n");
108                 else {
109                     int left=Query1(0,a-1,0,n-1,1);
110 
111                     int l=Query2(left+1,0,n-1,1);
112                     int r=Query2(left+min(s,b),0,n-1,1);
113                     printf("%d %d\n",l,r);
114                     updata(l,r,1,0,n-1,1);
115                 }
116             }else {
117                 printf("%d\n",b-a+1-Query1(a,b,0,n-1,1));
118                 updata(a,b,0,0,n-1,1);
119             }
120         }
121         printf("\n");
122     }
123     return 0;
124 }
View Code

 

posted @ 2013-07-29 20:59  Thousand Sunny  阅读(176)  评论(0编辑  收藏  举报