zoukankan      html  css  js  c++  java
  • L

    题意 给出一排空花瓶 有两种操作  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.
    ");
     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
    ",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
    ",c-b+1-query(1,b,c));
    113             update(1,b,c,1);
    114         }
    115         }
    116         printf("
    ");
    117         
    118     }
    119     return 0;
    120 }
  • 相关阅读:
    python学习之列表和字典
    python学习之字符串(下)
    python学习之数字
    python学习之核心数据类型
    android 学习Layout布局的使用
    android学习SeekBar的使用
    android学习Gallery和ImageSwitch的使用
    android学习ScrollView的使用
    android学习ViewFlipper的使用
    C#怎么判断传入int值是否是枚举里面的值
  • 原文地址:https://www.cnblogs.com/ttttttttrx/p/10349475.html
Copyright © 2011-2022 走看看