• HDU--1540 Tunnel Warfare(线段树区间更新)


    题目链接:1540 Tunnel Warfare

    以为单组输入 这个题多组输入

    结构体记录每个区间左边和右边的连续区间 ms记录最大

    在查询操作时:

    1、这个点即将查询到右区间 看这个点 x 是否存在于右区间的ls 如果存在说明有可能 左区间的rs 和右区间的 ls 是连续的 这时候我们要考虑查询两个区间并且 值想加

    查询 左区间的时候同理

    #include<bits/stdc++.h>
    using namespace std;
    #define maxn 500010
    struct ac{
      int ls,rs,ms;
    }a[maxn];
    int b[maxn];
    void build(int l,int r,int in){
       if(l==r){
          a[in].ls=a[in].rs=a[in].ms=1;
          return ;
       }
       int mid=(l+r)/2;
       build(l,mid,in*2);
       build(mid+1,r,in*2+1);
       a[in].ms=a[in].ls=a[in].rs=(a[in*2].ms+a[in*2+1].ms);
    }
    void updata(int l,int r,int in,int z,int i){
       if(l==r){
          if(i>0){
             a[in].ls=a[in].rs=a[in].ms=1;
          }else{
             a[in].ls=a[in].rs=a[in].ms=0;
          }
          return ;
       }
       int mid=(l+r)/2;
       if(z>mid){
          updata(mid+1,r,in*2+1,z,i);
       }else updata(l,mid,in*2,z,i);
       int ll=in*2,rr=in*2+1;
       a[in].ls=a[ll].ls;
       a[in].rs=a[rr].rs;
       a[in].ms=max(a[ll].ms,max(a[rr].ms,a[ll].rs+a[rr].ls));
       if(a[ll].ls==(mid-l+1)){
          a[in].ls+=a[rr].ls;
       }
       if(a[rr].rs==(r-mid)){
          a[in].rs+=a[ll].rs;
       }
    }
    int query(int l,int r,int in,int z){
       if((a[in].ms==(r-l+1))||(a[in].ms==0)||(l==r)){
          return a[in].ms;
       }
       int mid=(l+r)/2;
       if(z>mid){
          if(z<=mid+a[in*2+1].ls){
             return query(mid+1,r,in*2+1,z)+query(l,mid,in*2,mid);
          }else return query(mid+1,r,in*2+1,z);
       }else{
          if(z>=mid-a[in*2].rs+1){
             return query(l,mid,in*2,z)+query(mid+1,r,in*2+1,mid+1);
          }else return query(l,mid,in*2,z);
       }
    }
    int main(){
       int n,m;
       while(cin>>n>>m){
           build(1,n,1);
           int len=0;
           for(int j=0;j<m;j++){
              char c[10];
              int x;
              cin>>c;
              if(c[0]=='D'){
                 cin>>x;
                 b[++len]=x;
                 updata(1,n,1,x,0);
              }else if(c[0]=='R'){
                 if(len-1>=0)
                   updata(1,n,1,b[len--],1);
              }else{
                 cin>>x;
                 cout<<query(1,n,1,x)<<endl;
              }
           }
       }
    }
  • 相关阅读:
    javascript定义函数后立即执行(IIFE)
    工作流选型专项,Camunda or flowable or?
    Excel中的xlsm宏密码怎么破解
    《生命是什么》总结
    《麦肯锡教我的思考武器》总结
    《作为意志和表象的世界》总结
    Go语言如何将json时间格式化为dateime格式
    《少有人走的路》总结
    《时间简史》总结
    架构的常规分类及复用重点
  • 原文地址:https://www.cnblogs.com/Dvelpro/p/9910768.html
Copyright © 2020-2023  润新知