牛客国庆集训派对Day1-J Princess Principal
地址: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;
}