zoukankan      html  css  js  c++  java
  • 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;
              }
           }
       }
    }
  • 相关阅读:
    详解Java动态代理机制(二)----cglib实现动态代理
    详解Java动态代理机制
    struts2标签库----控制标签详解
    Struts2框架的基本使用(三)
    详解Java反射机制
    Struts2框架的基本使用(二)
    Struts2框架的基本使用
    Servlet3.0新特性(从注解配置到websocket编程)
    使用Java注解来简化你的代码
    ios 跟踪UITextField更改的简单方法
  • 原文地址:https://www.cnblogs.com/Dvelpro/p/9910768.html
Copyright © 2011-2022 走看看