Princess Principal(思維題|可用線段樹做)
阿新 • • 發佈:2018-10-01
alt -i 沒有 https cstring target 偶數 isp pre
這次用於訓練的是一個含有n個括號的文檔。括號一共有m種,每種括號都有左括號和右括號兩種形式。我們定義用如下的方式定義一個合法的文檔:
1.一個空的字符串是一個合法的文檔。
2.如果A,B都是合法的文檔,那麽AB也是合法的文檔。
3.如果S是合法的文檔,那麽aSb也是合法的文檔,其中a,b是同一種括號,並且a是左括號,b是右括號。
現在給出q個詢問,每次詢問只考慮文檔第l至r個字符的情況下,文檔是不是合法的。
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 ≤ 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;View Code16 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(思維題|可用線段樹做)