阿尔比恩王国(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;
}