hdu4614Vases and Flowers

http://acm.hdu.edu.cn/showproblem.php?pid=4614

线段树的各种操作 写的有点乱 求插入位置是以区间K值的方法求出的 向下更新

  1 #include <iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 using namespace std;
  6 #define N 50010
  7 int s[N<<2],lz[N<<2];
  8 void build(int l,int r,int w)
  9 {
 10     s[w] = r-l+1;
 11     lz[w] = -1;
 12     if(l==r)
 13     {
 14         s[w] = 1;
 15         return ;
 16     }
 17     int m = (l+r)>>1;
 18     build(l,m,w<<1);
 19     build(m+1,r,w<<1|1);
 20 }
 21 void pushup(int w)
 22 {
 23     s[w] = s[w<<1]+s[w<<1|1];
 24 }
 25 void pushdown(int l,int r,int w)
 26 {
 27     int m = (l+r)/2;
 28     if(lz[w]!=-1)
 29     {
 30         lz[w<<1] = lz[w<<1|1] = lz[w];
 31         if(lz[w])
 32         {
 33             s[w<<1] = m-l+1;
 34             s[w<<1|1] = r-m;
 35         }
 36         else
 37         s[w<<1] = s[w<<1|1] = 0;
 38         lz[w] = -1;
 39     }
 40 }
 41 int query(int p,int l,int r,int w)
 42 {
 43     if(l==r)
 44     {
 45         return l;
 46     }
 47     pushdown(l,r,w);
 48     int m = (l+r)>>1;
 49     if(p<=s[w<<1])
 50     return query(p,l,m,w<<1);
 51     else
 52     return query(p-s[w<<1],m+1,r,w<<1|1);
 53 }
 54 void update(int d,int a,int b,int l,int r,int w)
 55 {
 56     if(a<=l&&b>=r)
 57     {
 58         if(d)
 59         s[w] = r-l+1;
 60         else
 61         s[w] = 0;
 62         lz[w] = d;
 63         return ;
 64     }
 65     pushdown(l,r,w);
 66     int m = (l+r)>>1;
 67     if(a<=m)
 68     update(d,a,b,l,m,w<<1);
 69     if(b>m)
 70     update(d,a,b,m+1,r,w<<1|1);
 71     pushup(w);
 72 }
 73 int add(int a,int b,int l,int r,int w)
 74 {
 75     if(a<=l&&b>=r)
 76     {
 77         return s[w];
 78     }
 79     pushdown(l,r,w);
 80     int m = (l+r)>>1,re=0;
 81     if(a<=m)
 82     re+=add(a,b,l,m,w<<1);
 83     if(b>m)
 84     re+=add(a,b,m+1,r,w<<1|1);
 85     return re;
 86 }
 87 int main()
 88 {
 89     int t,n,m,k;
 90     //freopen("1004.in","r",stdin);
 91     //freopen("aa.txt","w",stdout);
 92     cin>>t;
 93     while(t--)
 94     {
 95         scanf("%d%d",&n,&m);
 96         build(0,n-1,1);
 97         while(m--)
 98         {
 99             int a,b;
100             scanf("%d%d%d",&k,&a,&b);
101             if(k==1)
102             {
103                 int ss;
104                 if(a>0)
105                 ss = add(0,a-1,0,n-1,1);
106                 else ss=0;
107                 int x = query(ss+1,0,n-1,1);
108                 if(s[1]-ss<b)
109                 b = s[1]-ss;
110                 int y = query(ss+b,0,n-1,1);
111                 if(ss==s[1])
112                 printf("Can not put any one.
");
113                 else
114                 {printf("%d %d
",x,y);
115                 update(0,x,y,0,n-1,1);
116                 }
117             }
118             else
119             {
120                 int sx = add(a,b,0,n-1,1);
121                 //cout<<sx<<" ,"<<endl;
122 
123                 if(b>n-1)
124                 b = n-1;
125                 printf("%d
",b-a+1-sx);
126                 update(1,a,b,0,n-1,1);
127             }
128         }
129         puts("");
130     }
131     return 0;
132 }
View Code
原文地址:https://www.cnblogs.com/shangyu/p/3221149.html