@Wannafly summer camp Day2 H:Princess Principal (栈模拟)

版权声明:岂曰无衣,与子同袍 https://blog.csdn.net/sizaif/article/details/82964080

阿尔比恩王国(the Albion Kingdom)潜伏着一群代号“白鸽队(Team White Pigeon)”的间谍。在没有任务的时候,她们会进行各种各样的训练,比如快速判断一个文档有没有语法错误,这有助于她们鉴别写文档的人受教育程度。

这次用于训练的是一个含有n个括号的文档。括号一共有mm种,每种括号都有左括号和右括号两种形式。我们定义用如下的方式定义一个合法的文档:

1.一个空的字符串是一个合法的文档。
2.如果A,B都是合法的文档,那么AB也是合法的文档。
3.如果S是合法的文档,那么aSb也是合法的文档,其中a,b是同一种括号,并且a是左括号,b是右括号。
现在给出q个询问,每次询问只考虑文档第ll至rr个字符的情况下,文档是不是合法的。

输入

第一行两个整数n,m,q(1≤n,m,q≤106)。
第二行有n个空格隔开的整数x,第i个整数xi(0≤xi<m∗2)代表文档中的第i个字符是第⌊x/2⌋种括号,且如果xi是偶数,它代表一个左括号,否则它代表一个右括号。
接下来q行,每行两个空格隔开的整数l,r(1≤l≤r≤n),代表询问第l至r个字符构成的字符串是否是一个合法的文档。

输出

输出共q行,如果询问的字符串是一个合法的文档,输出"Yes",否则输出"No"。

样例输入

6 4 3
0 2 3 1 4 7
1 4
1 5
5 6

样例输出

Yes
No
No

数据量 1e6  ... 

以为是 RMQ的查询...

很难受,

其实 ,只需要 用 栈 模拟   预处理,   预处理 用 pos[]  记录位置.   最后判断  pos[r] =? pos[l-1]   

[代码]

#include <bits/stdc++.h>
#include <stdio.h>
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,a,n) for(int i=n;i>=a;i--)

typedef long long ll;
const int maxn = 1e6+10;
const int mod =1e9+7;
const int inf = 0x3f3f3f3f;
using namespace std;

ll a[maxn];
ll sta[maxn];
ll pos[maxn];
int main(int argc, char const *argv[])
{
	ll n,m,q;
	cin>>n>>m>>q;
	rep(i,1,n) scanf("%lld",&a[i]);
	int tot = 0;
	rep(i,1,n)
	{
		if( tot == 0 )
			sta[++tot] = i;
		else if( a[i]/2 == a[ sta[tot] ]/2 && a[ sta[tot] ]+1 == a[i] )
			tot--;
		else
			sta[++tot] = i;
		pos[i] = sta[tot];
	}
	while(q--)
	{
		int x,y;
		scanf("%d %d",&x,&y);
		if( pos[y] == pos[x-1])
			printf("Yes\n");
		else
			printf("No\n");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/sizaif/article/details/82964080