题意是跟新查找
不同的时候要输出这个字符位置最长字符串,用ls表示从这个区间左端开始的最长字符串,rs表示从右边开始,ms是中间最长(a[i].ms=max(a[i*2].ms,max(a[i*2+1].ms,(a[i*2].rs+a[i*2+1].ls)));
注意查找的时候
if(t<=a[i*2+1].ls+a[i*2+1].l-1)
return qurry(i*2,mid)+qurry(i*2+1,t);
当右边区间满足不了t时,就需要加上左区间的长度了
//
// main.cpp
// 1540
//
// Created by Mr.Xue on 17/7/24.
// Copyright © 2017年 Mr.Xue. All rights reserved.
//
#include
#include
#include
#include
#include
using namespace std;
const int maxn = 50000+10;
int n,m;
int s[maxn],top;//s为模拟栈
struct node
{
int l,r;
int ls,rs,ms;//ls,左端最大连续区间,rs右端最大连续区间,ms区间内最大连续区间
} a[maxn<<2];
void build(int l,int r,int i)
{
a[i].l=l;
a[i].r=r;
a[i].ls=a[i].rs=a[i].ms=r-l+1;
if(l==r)
return;
int mid=(l+r)/2;
build(l,mid,i*2);
build(mid+1,r,i*2+1);
}
void insert(int i,int t,int x)
{
if(a[i].l==a[i].r&&a[i].l==t)
{
if(x==0)
a[i].ls=a[i].rs=a[i].ms=0;
else
a[i].ls=a[i].rs=a[i].ms=1;
return ;
}
int mid=(a[i].l+a[i].r)/2;
if(t<=mid)
insert(i*2,t,x);
else
insert(i*2+1,t,x);
a[i].ms=max(a[i*2].ms,max(a[i*2+1].ms,(a[i*2].rs+a[i*2+1].ls)));
a[i].ls=a[i*2].ls;
a[i].rs=a[i*2+1].rs;
if(a[i*2+1].rs==a[i*2+1].r-a[i*2+1].l+1)
a[i].rs+=a[i*2].rs;
if(a[i*2].ls==a[i*2].r-a[i*2].l+1)
a[i].ls+=a[i*2+1].ls;
}
int qurry(int i,int t)
{
if(a[i].l==a[i].r||a[i].ms==a[i].r-a[i].l+1||a[i].ms==0)
return a[i].ms;
int mid=(a[i].l+a[i].r)/2;
if(t>mid)
{
if(t<=a[i*2+1].ls+a[i*2+1].l-1)
return qurry(i*2,mid)+qurry(i*2+1,t);
else
return qurry(i*2+1,t);
}
else
{
if(t>=(a[i*2].r-a[i*2].rs+1))
return qurry(i*2+1,mid+1)+qurry(i*2,t);
else
return qurry(i*2,t);
}
}
int main()
{
int x=0;
char ch[2];
while(~scanf("%d%d",&n,&m))
{
top = 0;
build(1,n,1);
while(m--)
{
scanf("%s",ch);
if(ch[0] == 'D')
{
scanf("%d",&x);
s[top++] = x;
insert(1,x,0);
}
else if(ch[0] == 'Q')
{
scanf("%d",&x);
printf("%d\n",qurry(1,x));
}
else
{
if(x>0)
{
x = s[--top];
insert(1,x,1);
}
}
}
}
return 0;
}