标签:二分 upd ... c++ check color code else str
题意 给出一排空花瓶 有两种操作 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; 12 flag=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 线段树+二分
标签:二分 upd ... c++ check color code else str
原文地址:https://www.cnblogs.com/ttttttttrx/p/10349475.html