L - Vases and Flowers HDU - 4614 線段樹+二分
阿新 • • 發佈:2019-02-03
d+ == oid () style emp \n ... spa
題意 給出一排空花瓶 有兩種操作 1是 從A花瓶開始放F朵花 如果當前瓶有花就跳過前往下一個 直到花用完或者 瓶子到了最後一個為止 輸出 成功放花的第一個和最後一個 如果沒有輸出 can not.......
2是 清空 一段區間的花 並輸出清空了多少朵花
思路:用線段樹維護一段區間有多少空花瓶 1操作 就是兩次二分 分別求起點和終點 起點 check條件是 query(1,a,mid)>0 終點是 query(1,二分出的起點,mid)>=min(f,query(1,a,n-1)) 這裏min是因為有可能總共就沒有那麽多空瓶子 而二分要求的是最後一個放的空瓶子 如果不min 一旦不夠每次 二分出的都是n-1就不符合題意了
還有就是吐槽一下vj爬網頁爬出 [pre]到輸出了 我說怎麽會有那麽奇葩的輸出 。。。
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=50000+5; 4 int n; 5 struct Node{ 6 int l,r; 7 long long sum; 8 int flag=-1; 9 void update(int value){ 10 if(value==1){ 11 sum=r-l+1; 12flag=1; 13 }else if(value==0){ 14 sum=0; 15 flag=0; 16 } 17 } 18 }tree[maxn*4]; 19 void push_up(int x){ 20 tree[x].sum=tree[x<<1].sum+tree[x<<1|1].sum; 21 } 22 void push_down(int x){ 23 if(tree[x].flag==1){ 24 tree[x<<1].sum=tree[x<<1].r-tree[x<<1].l+1; 25 tree[x<<1|1].sum=tree[x<<1|1].r-tree[x<<1|1].l+1; 26 tree[x<<1|1].flag=tree[x<<1].flag=1; 27 tree[x].flag=-1; 28 } 29 else if(tree[x].flag==0){ 30 tree[x<<1].sum=0; 31 tree[x<<1|1].sum=0; 32 tree[x<<1|1].flag=tree[x<<1].flag=0; 33 tree[x].flag=-1; 34 } 35 } 36 void update(int x,int l,int r,int value){ 37 if(tree[x].l>=l&&tree[x].r<=r){ 38 tree[x].update(value); 39 return ; 40 } 41 int mid=tree[x].l+tree[x].r>>1; 42 push_down(x); 43 if(mid>=l)update(x<<1,l,r,value); 44 if(mid<r)update(x<<1|1,l,r,value); 45 push_up(x); 46 } 47 int query(int x,int l,int r){ 48 if(tree[x].l>=l&&tree[x].r<=r){ 49 return tree[x].sum; 50 51 } 52 int mid=tree[x].l+tree[x].r>>1; 53 push_down(x); 54 long long ans=0; 55 if(mid>=l)ans+=query(x<<1,l,r); 56 if(mid<r)ans+=query(x<<1|1,l,r); 57 return ans; 58 } 59 void build(int x,int l,int r){ 60 tree[x].l=l,tree[x].r=r; 61 tree[x].sum=r-l+1; 62 tree[x].flag=-1; 63 if(l==r)return ; 64 int mid=l+r>>1; 65 build(x<<1,l,mid); 66 build(x<<1|1,mid+1,r); 67 } 68 void work(int a,int f){ 69 int l=a,r=n-1; 70 int ans1=-1; 71 int temp=query(1,a,n-1); 72 if(temp==0){ 73 printf("Can not put any one.\n"); 74 return ; 75 } 76 while(l<=r){ 77 int mid=l+r>>1; 78 if(query(1,a,mid)!=0){ 79 ans1=mid; 80 r=mid-1; 81 } 82 else l=mid+1; 83 } 84 l=ans1,r=n-1; 85 int ans2=-1; 86 f=min(f,temp); 87 while(l<=r){ 88 int mid=l+r>>1; 89 if(query(1,ans1,mid)>=f){ 90 ans2=mid; 91 r=mid-1; 92 } 93 else l=mid+1; 94 } 95 printf("%d %d\n",ans1,ans2); 96 update(1,ans1,ans2,0); 97 } 98 int main(){ 99 int t ,m; 100 scanf("%d",&t); 101 while(t--){ 102 scanf("%d%d",&n,&m); 103 build(1,0,n-1); 104 int a,b,c; 105 while(m--){ 106 scanf("%d%d%d",&a,&b,&c); 107 if(a==1){ 108 work(b,c); 109 } 110 if(a==2){ 111 112 printf("%d\n",c-b+1-query(1,b,c)); 113 update(1,b,c,1); 114 } 115 } 116 printf("\n"); 117 118 } 119 return 0; 120 }
L - Vases and Flowers HDU - 4614 線段樹+二分