标签:amp team 题目 alt 两种 closed 线段 color 输出
https://www.nowcoder.com/acm/contest/201/J
第一行两个整数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 }
Princess Principal(思维题|可用线段树做)
标签:amp team 题目 alt 两种 closed 线段 color 输出
原文地址:https://www.cnblogs.com/Fighting-sh/p/9735679.html