1. 程式人生 > >Princess Principal(思維題|可用線段樹做)

Princess Principal(思維題|可用線段樹做)

alt -i 沒有 https cstring target 偶數 isp pre

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,q(1 ≤ n,m,q ≤ 10
6
)。第二行有n個空格隔開的整數x,第i個整數x
i
(0 ≤ x
i
 < m*2)代表文檔中的第i個字符是第
技術分享圖片
種括號。另外,如果x
i
是偶數,它代表一個左括號,否則它代表一個右括號。
接下來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 }
View Code  

Princess Principal(思維題|可用線段樹做)