Princess Principal
https://www.nowcoder.com/acm/contest/201/J
题目描述
阿尔比恩王国(the Albion Kingdom)潜伏着一群代号“白鸽队(Team White Pigeon)”的间谍。在没有任务的时候,她们会进行各种各样的训练,比如快速判断一个文档有没有语法错误,这有助于她们鉴别写文档的人受教育程度。
这次用于训练的是一个含有n个括号的文档。括号一共有m种,每种括号都有左括号和右括号两种形式。我们定义用如下的方式定义一个合法的文档:
1.一个空的字符串是一个合法的文档。
2.如果A,B都是合法的文档,那么AB也是合法的文档。
3.如果S是合法的文档,那么aSb也是合法的文档,其中a,b是同一种括号,并且a是左括号,b是右括号。
现在给出q个询问,每次询问只考虑文档第l至r个字符的情况下,文档是不是合法的。
这次用于训练的是一个含有n个括号的文档。括号一共有m种,每种括号都有左括号和右括号两种形式。我们定义用如下的方式定义一个合法的文档:
1.一个空的字符串是一个合法的文档。
2.如果A,B都是合法的文档,那么AB也是合法的文档。
3.如果S是合法的文档,那么aSb也是合法的文档,其中a,b是同一种括号,并且a是左括号,b是右括号。
现在给出q个询问,每次询问只考虑文档第l至r个字符的情况下,文档是不是合法的。
输入描述:
第一行两个整数n,m,q(1 ≤ n,m,q ≤ 106
)。第二行有n个空格隔开的整数x,第i个整数xi
(0 ≤ xi
< m*2)代表文档中的第i个字符是第
种括号。另外,如果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
个人感觉思路很神奇,可能是因为我太菜了。。。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<stack> 6 using namespace std; 7 8 int a[1000005]; 9 int ans[1000005]; 10 11 int main(){ 12 std::ios::sync_with_stdio(false); 13 int n,m,q; 14 stack<int>st; 15 cin>>n>>m>>q; 16 for(int i=1;i<=n;i++){ 17 cin>>a[i]; 18 } 19 for(int i=1;i<=n;i++){ 20 if(st.empty()){ 21 st.push(i); 22 } 23 else if((a[st.top()]/2!=a[i]/2)||(a[st.top()]+1!=a[i])){ 24 st.push(i); 25 } 26 else{ 27 st.pop(); 28 } 29 if(st.empty()){ 30 ans[i]=0; 31 } 32 else{ 33 ans[i]=st.top(); 34 } 35 } 36 int x,y; 37 while(q--){ 38 cin>>x>>y; 39 if((y-x)&1){ 40 if(ans[y]==ans[x-1]){ 41 puts("Yes"); 42 } 43 else{ 44 puts("No"); 45 } 46 } 47 else{ 48 puts("No"); 49 } 50 } 51 }