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
  • 相关阅读:
    1130 host '***' is not allowed to connect to this MySQL server
    签名时出错,未能对....ext签名。SignTool Error: No certificates...
    C# 进制转换(二进制、十六进制、十进制互转)
    在安装32位Oracle客户端组建的情况下以64位模式运行
    Vue中引入jQuery
    sql server数据库分离时,数据库右侧显示(单个用户)
    解决Typora图片显示问题
    Ruby日文手册翻译1
    Boost Graph Library 库小结1
    归并排序
  • 原文地址:https://www.cnblogs.com/zstu-abc/p/3223933.html
Copyright © 2011-2022 走看看