算法竞赛训练实录

Posted vege-chicken-rainstar

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法竞赛训练实录相关的知识,希望对你有一定的参考价值。

[toc]

Codeforces Round 603

ABCD

都是很水的题。 cout << 000输出0,而cout<<"000"才输出000,因为这个WA6次要被笑(打)死。

E

判定括号序列合法性:每一个前缀和不小于0,同时最后一个前缀和等于0.线段树更新即可.新技能Get.

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
int minz[maxn*4],tg[maxn*4],maxz[maxn*4],tg2[maxn*4];
char s[maxn];
inline int ls(int x){
	return x<<1;
}
inline int rs(int x){
	return x<<1|1;
}
void pushdown(int rt){
	if(tg[rt]==0) return;
	minz[ls(rt)]+=tg[rt];
	tg[ls(rt)]+=tg[rt];
	minz[rs(rt)]+=tg[rt];
	tg[rs(rt)]+=tg[rt];
	tg[rt]=0;
}
void pushdown2(int rt){
	if(tg2[rt]==0) return;
	maxz[ls(rt)]+=tg2[rt];
	tg2[ls(rt)]+=tg2[rt];
	maxz[rs(rt)]+=tg2[rt];
	tg2[rs(rt)]+=tg2[rt];
	tg2[rt]=0;
}
int upd(int il,int ir,int d,int rt,int l,int r){
	if(il>r||ir<l) return minz[rt];
	if(l>=il&&r<=ir){
		minz[rt]+=d;
		tg[rt]+=d;
		return minz[rt];
	}
	pushdown(rt);
	int mid=(l+r)>>1;
	return minz[rt]=min(upd(il,ir,d,ls(rt),l,mid),upd(il,ir,d,rs(rt),mid+1,r));
}
int ask(int il,int ir,int rt,int l,int r){
	if(il>r||ir<l) return 0x3f3f3f3f;
	if(l>=il&&r<=ir) return minz[rt];
	pushdown(rt);
	int mid=(l+r)>>1;
	return min(ask(il,ir,ls(rt),l,mid),ask(il,ir,rs(rt),mid+1,r));
}
int upd2(int il,int ir,int d,int rt,int l,int r){
	if(il>r||ir<l) return maxz[rt];
	if(l>=il&&r<=ir){
		maxz[rt]+=d;
		tg2[rt]+=d;
		return maxz[rt];
	}
	pushdown2(rt);
	int mid=(l+r)>>1;
	return maxz[rt]=max(upd2(il,ir,d,ls(rt),l,mid),upd2(il,ir,d,rs(rt),mid+1,r));
}
int ask2(int il,int ir,int rt,int l,int r){
	if(il>r||ir<l) return 0;
	if(l>=il&&r<=ir) return maxz[rt];
	pushdown2(rt);
	int mid=(l+r)>>1;
	return max(ask2(il,ir,ls(rt),l,mid),ask2(il,ir,rs(rt),mid+1,r));
}
int st[maxn];
int main(){
	int n;
	scanf("%d",&n);
	scanf("%s",s+1);
	int cur=1;
	for(int i=1;i<=n;i++){
		if(s[i]==‘L‘) cur=max(1,cur-1);
		else if(s[i]==‘R‘) {
			cur++;
		}
		else if(s[i]==‘(‘) {
			if(st[cur]==1) ;
			else if(st[cur]==0){
				st[cur]=1;
				upd(cur,n,1,1,1,n);
				upd2(cur,n,1,1,1,n);
			}
			else {
				st[cur]=1;
				upd(cur,n,2,1,1,n);
				upd2(cur,n,2,1,1,n);
			}
		}
		else if(s[i]==‘)‘){
			if(st[cur]==-1);
			else if(st[cur]==0){
				st[cur]=-1;
				upd(cur,n,-1,1,1,n);
				upd2(cur,n,-1,1,1,n);
			}
			else {
				st[cur]=-1;
				upd(cur,n,-2,1,1,n);
				upd2(cur,n,-2,1,1,n);
			}
		}
		else{
			if(st[cur]==0) ;
			else if(st[cur]==1){
				st[cur]=0;
				upd(cur,n,-1,1,1,n);
				upd2(cur,n,-1,1,1,n);
			}
			else {
				st[cur]=0;
				upd(cur,n,1,1,1,n);
				upd2(cur,n,1,1,1,n);
			}
		}
		if(ask(1,n,1,1,n)>=0&&ask(n,n,1,1,n)==0){
			printf("%d ", ask2(1,n,1,1,n));
		}
		else printf("-1 ");
	}
	return 0;
}

以上是关于算法竞赛训练实录的主要内容,如果未能解决你的问题,请参考以下文章

算法竞赛入门经典——训练指南

算法竞赛入门经典训练指南pdf高清版免费下载

算法竞赛入门经典训练指南-做题详细记录(更新中)

算法竞赛训练指南11.2 最小生成树

算法竞赛入门码蹄集进阶塔335题(MT3330-3335)

算法竞赛训练指南2.1 计数方法