poj 3667--线段树

http://poj.org/problem?id=3667

线段树,区间合并。

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 #define maxn 55555
 5 #define lson l,m,rt<<1
 6 #define rson m+1,r,rt<<1|1
 7 int msum[maxn<<2],lsum[maxn<<2],rsum[maxn<<2];
 8 int flag[maxn<<2];
 9 int max(int a,int b)
10 {
11     return a>b?a:b;
12 }
13 void Pushdown(int rt,int num)
14 {
15     if(flag[rt]!=-1)
16     {
17         flag[rt<<1]=flag[rt<<1|1]=flag[rt];
18         msum[rt<<1]=lsum[rt<<1]=rsum[rt<<1]=flag[rt]?0:num-(num>>1);
19         msum[rt<<1|1]=lsum[rt<<1|1]=rsum[rt<<1|1]=flag[rt]?0:num>>1;
20         flag[rt]=-1;
21     }
22 }
23 void Pushup(int rt,int num)
24 {
25     lsum[rt]=lsum[rt<<1];
26     rsum[rt]=rsum[rt<<1|1];
27     if(lsum[rt]==num-(num>>1)) lsum[rt]+=lsum[rt<<1|1];
28     if(rsum[rt]==num>>1) rsum[rt]+=rsum[rt<<1];
29     msum[rt]=max(lsum[rt<<1|1]+rsum[rt<<1],max(msum[rt<<1],msum[rt<<1|1]));
30 }
31 void build(int l,int r,int rt)
32 {
33     flag[rt]=-1;
34     msum[rt]=lsum[rt]=rsum[rt]=r-l+1;
35     if(l==r) return;
36     int m=(l+r)>>1;
37     build(lson);
38     build(rson);
39 }
40 void update(int L,int R,int w,int l,int r,int rt)
41 {
42     if(L<=l&&r<=R)
43     {
44         flag[rt]=w;
45         msum[rt]=lsum[rt]=rsum[rt]=flag[rt]?0:r-l+1;
46         return;
47     }
48     Pushdown(rt,r-l+1);
49     int m=(l+r)>>1;
50     if(L<=m)
51         update(L,R,w,lson);
52     if(R>m)
53         update(L,R,w,rson);
54     Pushup(rt,r-l+1);
55 }
56 int query(int w,int l,int r,int rt)
57 {
58     if(l==r)
59         return l;
60     Pushdown(rt,r-l+1);
61     int m=(l+r)>>1;
62     if(msum[rt<<1]>=w)
63         return query(w,lson);
64     else if(lsum[rt<<1|1]+rsum[rt<<1]>=w)
65         return m-rsum[rt<<1]+1;
66     else
67         return query(w,rson);
68 }
69 int main()
70 {
71     int n,m,a,b,c;
72     while(~scanf("%d %d",&n,&m))
73     {
74         build(1,n,1);
75         while(m--)
76         {
77             scanf("%d",&c);
78             if(c==1)
79             {
80                 scanf("%d",&a);
81                 if(msum[1]<a) puts("0");
82                 else
83                 {
84                     int p=query(a,1,n,1);
85                     printf("%d\n",p);
86                     update(p,p+a-1,1,1,n,1);
87                 }
88             }
89             else
90             {
91                 scanf("%d %d",&a,&b);
92                 update(a,a+b-1,0,1,n,1);
93             }
94         }
95     }
96     return 0;
97 }

 

posted on 2013-02-09 20:14  acoderworld  阅读(60)  评论(0)    收藏  举报

导航