• 【POJ3667】Hotel(线段树)


    题意:有n个依次编号的元素,要求维护以下两个操作:

    1.询问整个数列中是否有长度>=x的连续的一段未被标记的元素,若无输出0,若有输出最小的开始编号ans并将[ans,ans+x-1]标记

    2.将[x,x+y-1]其中的元素取消标记(如果有)

    n,m<=5e4

    思路:线段树区间合并

    记录从左、右边开始最长连续长度,一段最长连续长度,以及标记状态

    Pascal跑的比C++快……

      1 #include<cstdio>
      2 #include<cstring>
      3 #include<string>
      4 #include<cmath>
      5 #include<iostream>
      6 #include<algorithm>
      7 #include<map>
      8 #include<set>
      9 #include<queue>
     10 #include<vector>
     11 using namespace std;
     12 typedef long long ll;
     13 typedef unsigned int uint;
     14 typedef unsigned long long ull;
     15 typedef pair<int,int> PII;
     16 typedef vector<int> VI;
     17 #define fi first
     18 #define se second
     19 #define MP make_pair
     20 #define N   210000
     21 #define M   7010
     22 #define eps 1e-8
     23 #define pi  acos(-1)
     24 #define oo  1e9
     25 #define MOD 10007
     26 
     27 struct node
     28 {
     29     int l,r,a,s;
     30 }t[N];
     31 
     32 void build(int l,int r,int p)
     33 {
     34     t[p].l=t[p].r=t[p].s=r-l+1;
     35     t[p].a=2;
     36     if(l==r) return;
     37     int mid=(l+r)>>1;
     38     build(l,mid,p<<1);
     39     build(mid+1,r,p<<1|1);
     40 }
     41 
     42 void pushdown(int l,int r,int p)
     43 {
     44     int ls=p<<1; int rs=ls+1;
     45     int mid=(l+r)>>1;
     46     if(t[p].a==1)
     47     {
     48         t[ls].l=t[ls].r=t[ls].s=t[rs].l=t[rs].r=t[rs].s=0;
     49         t[ls].a=t[rs].a=1;
     50     }
     51     if(t[p].a==2)
     52     {
     53         t[ls].l=t[ls].r=t[ls].s=mid-l+1;
     54         t[rs].l=t[rs].r=t[rs].s=r-mid;
     55         t[ls].a=t[rs].a=2;
     56     }
     57 }
     58 
     59 void pushup(int l,int r,int p)
     60 {
     61     int ls=p<<1; int rs=ls+1;
     62     if(t[ls].a==2) t[p].l=t[ls].l+t[rs].l;
     63      else t[p].l=t[ls].l;
     64     if(t[rs].a==2) t[p].r=t[rs].r+t[ls].r;
     65      else t[p].r=t[rs].r;
     66     t[p].s=max(max(t[ls].s,t[rs].s),t[ls].r+t[rs].l);
     67     if(t[ls].a==1&&t[rs].a==1) t[p].a=1;
     68      else if(t[ls].a==2&&t[rs].a==2) t[p].a=2;
     69       else t[p].a=3;
     70 }
     71 
     72 int query(int l,int r,int x,int p)
     73 {
     74     if(l==r) return l;
     75     pushdown(l,r,p);
     76     int ls=p<<1;
     77     int rs=ls+1;
     78     int mid=(l+r)>>1;
     79     if(t[ls].s>=x) return query(l,mid,x,ls);
     80      else if(t[ls].r+t[rs].l>=x) return mid-t[ls].r+1;
     81       else return query(mid+1,r,x,rs);
     82 }
     83 
     84 void update(int l,int r,int x,int y,int v,int p)
     85 {
     86     if(x<=l&&r<=y)
     87     {
     88         t[p].a=v;
     89         if(v==1)
     90         {
     91             t[p].l=t[p].r=t[p].s=0;
     92         }
     93         if(v==2)
     94         {
     95             t[p].l=t[p].r=t[p].s=r-l+1;
     96         }
     97         return;
     98     }
     99     if(t[p].a==v) return;
    100     pushdown(l,r,p);
    101     int mid=(l+r)>>1;
    102     int ls=p<<1;
    103     int rs=ls+1;
    104     if(x<=mid) update(l,mid,x,y,v,ls);
    105     if(y>mid) update(mid+1,r,x,y,v,rs);
    106     pushup(l,r,p);    
    107 }
    108     
    109 int main()
    110 {
    111 
    112     int n,m;
    113     scanf("%d%d",&n,&m);
    114     build(1,n,1);
    115     for(int i=1;i<=m;i++)
    116     {
    117         int x;
    118         scanf("%d",&x);
    119         if(x==1)
    120         {
    121             int y;
    122             scanf("%d",&y); 
    123             if(t[1].s<y) printf("0
    ");
    124              else
    125              {
    126                  int k=query(1,n,y,1);
    127                 printf("%d
    ",k);
    128                 update(1,n,k,k+y-1,1,1);
    129              }
    130         }
    131          else
    132          {
    133              int y,z;
    134              scanf("%d%d",&y,&z);
    135              update(1,n,y,y+z-1,2,1);
    136          }
    137     }    
    138     return 0;
    139 }
    140     
    141     
      1 var t:array[1..200000]of record
      2                           l,r,s:longint;
      3                          end;
      4     tag:array[1..200000]of longint;
      5     n,m,i,x,y,z,k:longint;
      6 
      7 procedure build(l,r,p:longint);
      8 var mid:longint;
      9 begin
     10  t[p].s:=r-l+1;
     11  tag[p]:=2;
     12  if l=r then exit;
     13 
     14  mid:=(l+r)>>1;
     15  build(l,mid,p<<1);
     16  build(mid+1,r,p<<1+1);
     17 end;
     18 
     19 function max(x,y:longint):longint;
     20 begin
     21  if x>y then exit(x);
     22  exit(y);
     23 end;
     24 
     25 procedure pushdown(l,r,p:longint);
     26 var ls,rs,mid,len:longint;
     27 begin
     28  ls:=p<<1; rs:=ls+1;
     29  mid:=(l+r)>>1;
     30  if tag[p]=1 then
     31  begin
     32   t[ls].l:=0; t[ls].r:=0; t[ls].s:=0; tag[ls]:=1;
     33   t[rs].l:=0; t[rs].r:=0; t[rs].s:=0; tag[rs]:=1;
     34  end;
     35  if tag[p]=2 then
     36  begin
     37   len:=mid-l+1;
     38   t[ls].l:=len; t[ls].r:=len; t[ls].s:=len; tag[ls]:=2;
     39   len:=r-(mid+1)+1;
     40   t[rs].l:=len; t[rs].r:=len; t[rs].s:=len; tag[rs]:=2;
     41  end;
     42 end;
     43 
     44 procedure pushup(l,r,p:longint);
     45 var ls,rs:longint;
     46 begin
     47  ls:=p<<1; rs:=ls+1;
     48  if tag[ls]=2 then t[p].l:=t[ls].l+t[rs].l
     49   else t[p].l:=t[ls].l;
     50  if tag[rs]=2 then t[p].r:=t[rs].r+t[ls].r
     51   else t[p].r:=t[rs].r;
     52  t[p].s:=max(t[ls].s,t[rs].s);
     53  t[p].s:=max(t[p].s,t[ls].r+t[rs].l);
     54  if (tag[ls]=1)and(tag[rs]=1) then tag[p]:=1
     55   else if (tag[ls]=2)and(tag[rs]=2) then tag[p]:=2
     56    else tag[p]:=3;
     57 end;
     58 
     59 function query(l,r,v,p:longint):longint;
     60 var mid,ls,rs:longint;
     61 begin
     62  if l=r then exit(l);
     63  pushdown(l,r,p);
     64  ls:=p<<1; rs:=ls+1;
     65  mid:=(l+r)>>1;
     66  if t[ls].s>=v then query:=query(l,mid,v,p<<1)
     67   else if t[ls].r+t[rs].l>=v then query:=mid-t[ls].r+1
     68    else query:=query(mid+1,r,v,p<<1+1);
     69 end;
     70 
     71 procedure update(l,r,x,y,v,p:longint);
     72 var mid,len:longint;
     73 begin
     74  if (l=x)and(r=y) then
     75  begin
     76   tag[p]:=v;
     77   if v=1 then
     78   begin
     79    t[p].l:=0; t[p].r:=0; t[p].s:=0;
     80   end;
     81   if v=2 then
     82   begin
     83    len:=y-x+1;
     84    t[p].l:=len; t[p].r:=len; t[p].s:=len;
     85   end;
     86   exit;
     87  end;
     88  if tag[p]=v then exit;
     89  pushdown(l,r,p);
     90  mid:=(l+r)>>1;
     91  if (x>=l)and(y<=mid) then update(l,mid,x,y,v,p<<1)
     92   else if (x>mid)and(y<=r) then update(mid+1,r,x,y,v,p<<1+1)
     93    else
     94    begin
     95     update(l,mid,x,mid,v,p<<1);
     96     update(mid+1,r,mid+1,y,v,p<<1+1);
     97    end;
     98  pushup(l,r,p);
     99 end;
    100 
    101 
    102 begin
    103 
    104  readln(n,m);
    105  build(1,n,1);
    106  for i:=1 to m do
    107  begin
    108   read(x);
    109   if x=1 then
    110   begin
    111    read(y);
    112    if t[1].s<y then writeln(0)
    113     else
    114     begin
    115      k:=query(1,n,y,1);
    116      writeln(k);
    117      update(1,n,k,k+y-1,1,1);
    118     end;
    119   end;
    120   if x=2 then
    121   begin
    122    read(y,z);
    123    update(1,n,y,y+z-1,2,1);
    124   end;
    125  end;
    126 
    127 end.
  • 相关阅读:
    where whereis locate find 的用法
    linux小知识
    linux touch和vi建立的文件是什么文件类型的
    linux创建文件的四种方式(其实是两种,强行4种)
    Linux mount实际使用
    linux文件系统和目录树的关系
    hard link && symbolic link
    Ext2文件系统的特点
    android pm命令
    linux安装源文件(.tar.gz)
  • 原文地址:https://www.cnblogs.com/myx12345/p/9861324.html
Copyright © 2020-2023  润新知