线段树模板

参考模板
题目

#include
#include
#include
#include
//#define ll long long 
//#define MAXN 1000010
#define INF 0X3f3f3f3f
#include
#include
#include
#include
typedef long long ll;
const int MAXN=1e6+10;
const ll mod=1000000007;
const ll inf=1e18;
using namespace std;
int n,m,k,t;

struct w{
	int l,r;
	int sum;
	int smin;
	int smax;
}tree[MAXN << 2];

inline void build(int i,int l,int r){//递归建树
    tree[i].l=l;tree[i].r=r;
    if(l==r){//如果这个节点是叶子节点
        tree[i].sum=0;//input[l];
        return ;
    }
    int mid=(l+r)>>1;
    build(i*2,l,mid);//分别构造左子树和右子树
    build(i*2+1,mid+1,r);
   // tree[i].sum=tree[i*2].sum+tree[i*2+1].sum;//刚才我们发现的性质return ;
}

inline void add(int i,int dis,int k){
    if(tree[i].l==tree[i].r){//如果是叶子节点,那么说明找到了
        tree[i].sum=k;
        tree[i].smax=k;
        tree[i].smin=k;
        return ;
    }
    if(dis<=tree[i*2].r)  add(i*2,dis,k);//在哪往哪跑
    else  add(i*2+1,dis,k);
    tree[i].sum=tree[i*2].sum+tree[i*2+1].sum;//返回更新
    tree[i].smax=max(tree[i*2].smax,tree[i*2+1].smax+tree[i*2].sum);
    tree[i].smin=min(tree[i*2].smin,tree[i*2+1].smin+tree[i*2].sum);
    return ;
}

char X[MAXN];


int main(){
	cin >> n;
	scanf("%s",X+1);
	build(1,1,n);
	int pos=1;
	for(int i=1;i<=n;i++){
		if(X[i]=='(') add(1,pos,1);
		else if(X[i]==')') add(1,pos,-1);
		else if(X[i]=='L') pos==1 ? 1:pos--;
		else if(X[i]=='R') pos++;
		else add(1,pos,0);
		if(tree[1].sum!=0 || tree[1].smin<0)cout <<"-1 ";
		else cout << tree[1].smax << " ";	 
	}
} 

你可能感兴趣的:(模板,ACM暑期集训)