题目链接: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[; return ; } ; build(l,mid,); build(mid+,r,+); a[].ms+a[+].ms); } void updata(int l,int r,int in,int z,int i){ if(l==r){ ){ a[; }else{ a[; } return ; } ; if(z>mid){ updata(mid+,r,+,z,i); },z,i); ,rr=+; 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)); )){ 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){ ))||(a[)||(l==r)){ return a[in].ms; } ; if(z>mid){ +].ls){ ,r,+,z)+query(l,mid,,mid); },r,+,z); }else{ ].rs+){ ,z)+query(mid+,r,+,mid+); },z); } } int main(){ int n,m; while(cin>>n>>m){ build(,n,); ; ;j<m;j++){ ]; int x; cin>>c; ]=='D'){ cin>>x; b[++len]=x; updata(,n,,x,); }]=='R'){ >=) updata(,n,,b[len--],); }else{ cin>>x; cout<<query(,n,,x)<<endl; } } } }