牛客国庆集训派对Day1-J Princess Principal

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/C_13579/article/details/82975837

地址:https://www.nowcoder.com/acm/contest/201/J

思路:恩。。。看完别人的题解才发现这么简单QAQ

对于括号匹配,首先想到的是用栈来处理,那么对于区间 a[l,r]是否匹配,匹配成功则说明a[l,r]间的括号全都抵消掉了,那么就可以用 d[i]来记录从头匹配到第i个时匹配失败的最后一个下标,这样当 a[l,r]匹配成功时,则 d[l-1]=d[r],否则 d[l-1]!=d[r],这样就可以判断是否匹配成功了

Code :

#include<iostream>
#include<cstdio>
#include<stack>
using namespace std;

const int MAX_N=1e6+5;
int n,m,Q;
int a[MAX_N],d[MAX_N];

int main()
{
	while(~scanf("%d%d%d",&n,&m,&Q)){
		stack<int> sta;
		for(int i=1;i<=n;++i)
		{
			scanf("%d",&a[i]);
			if(!sta.empty()){
				if(a[i]%2&&a[i]==a[sta.top()]+1)	sta.pop();
				else	sta.push(i);
			}else	sta.push(i);
			if(!sta.empty())	d[i]=sta.top();
			else	d[i]=0;
		}
		int l,r;
		while(Q--){
			scanf("%d%d",&l,&r);
			if(d[l-1]==d[r])	puts("Yes");
			else	puts("No");
		}
	}
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/C_13579/article/details/82975837