zoukankan      html  css  js  c++  java
  • hdu 4614 Vases and Flowers(线段树:成段更新)

        线段树裸题。自己写复杂了,准确说是没想清楚就敲了。

        先是建点为已插花之和,其实和未插花是一个道理,可是开始是小绕,后来滚雪球了,跪了。

        重新建图,分解询问1为:找出真正插画的开始点和终止点,做成段更新。

        再次向notonlysuccess大神致谢,清晰的代码+清晰的思路=ac

      1 #include<stdio.h>
      2 #include<string.h>
      3 #include<algorithm>
      4 using namespace std;
      5 
      6 #define lson l,m,rt<<1
      7 #define rson m+1,r,rt<<1|1
      8 
      9 const int MAXN=55555;
     10 int sum[MAXN<<2];
     11 int lag[MAXN<<2];
     12 int n;
     13 
     14 void PushUp(int rt)
     15 {
     16     if(lag[rt<<1]==lag[rt<<1|1]&&lag[rt<<1]!=-1)
     17         lag[rt]=lag[rt<<1];
     18     else
     19         lag[rt]=-1;
     20     sum[rt]=sum[rt<<1]+sum[rt<<1|1];
     21 }
     22 
     23 void PushDown(int rt,int m)
     24 {
     25     if(lag[rt]!=-1){
     26         lag[rt<<1]=lag[rt<<1|1]=lag[rt];
     27         sum[rt<<1]=(m-(m>>1))*(1-lag[rt]);
     28         sum[rt<<1|1]=(m>>1)*(1-lag[rt]);
     29         lag[rt]=-1;
     30 
     31     }
     32 }
     33 
     34 void Build(int l,int r,int rt)
     35 {
     36     lag[rt]=-1;
     37     if(l==r){
     38         sum[rt]=1;
     39         return ;
     40     }
     41     int m=(l+r)>>1;
     42     Build(lson);
     43     Build(rson);
     44     PushUp(rt);
     45 }
     46 
     47 void updata(int L,int R,int c,int l,int r,int rt)
     48 {
     49     if(L<=l&&r<=R){
     50         sum[rt]=(r-l+1)*(1-c);
     51         lag[rt]=c;
     52         return ;
     53     }
     54     PushDown(rt,r-l+1);
     55     int m=(l+r)>>1;
     56     if(L<=m)updata(L,R,c,lson);
     57     if(m<R)updata(L,R,c,rson);
     58     PushUp(rt);
     59 }
     60 
     61 int Query1(int L,int R,int l,int r,int rt)
     62 {
     63     if(L>R)
     64         return 0;
     65     if(L<=l&&r<=R)
     66         return sum[rt];
     67     PushDown(rt,r-l+1);
     68     int m=(l+r)>>1;
     69     int res=0;
     70     if(L<=m)
     71         res+=Query1(L,R,lson);
     72     if(m<R)
     73         res+=Query1(L,R,rson);
     74     return res;
     75 }
     76 
     77 int Query2(int p,int l,int r,int rt)
     78 {
     79     if(l==r)
     80         return l;
     81     PushDown(rt,r-l+1);
     82     int m=(l+r)>>1;
     83     if(p<=sum[rt<<1])
     84         return Query2(p,lson);
     85     else
     86         return Query2(p-sum[rt<<1],rson);
     87 }
     88 int main()
     89 {
     90     int T,m;
     91     int op,a,b,k;
     92     int flag=0;
     93     scanf("%d",&T);
     94     while(T--)
     95     {
     96         scanf("%d%d",&n,&m);
     97 
     98         Build(0,n-1,1);
     99 
    100         for(k=0;k<m;k++)
    101         {
    102             scanf("%d%d%d",&op,&a,&b);
    103 
    104             if(op==1){
    105                 int s=Query1(a,n-1,0,n-1,1);
    106                 if(!s)
    107                     printf("Can not put any one.
    ");
    108                 else {
    109                     int left=Query1(0,a-1,0,n-1,1);
    110 
    111                     int l=Query2(left+1,0,n-1,1);
    112                     int r=Query2(left+min(s,b),0,n-1,1);
    113                     printf("%d %d
    ",l,r);
    114                     updata(l,r,1,0,n-1,1);
    115                 }
    116             }else {
    117                 printf("%d
    ",b-a+1-Query1(a,b,0,n-1,1));
    118                 updata(a,b,0,0,n-1,1);
    119             }
    120         }
    121         printf("
    ");
    122     }
    123     return 0;
    124 }
    View Code
  • 相关阅读:
    RUST实践.md
    redis.md
    opencvrust.md
    aws rds can't connect to mysql server on 'xx'
    Foundation ActionScript 3.0 With Flash CS3 And Flex
    Foundation Flash Applications for Mobile Devices
    Flash Mobile Developing Android and iOS Applications
    Flash Game Development by Example
    Actionscript 3.0 迁移指南
    在SWT中非UI线程控制界面
  • 原文地址:https://www.cnblogs.com/zstu-abc/p/3223933.html
Copyright © 2011-2022 走看看