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) 收藏 举报
浙公网安备 33010602011771号