Princess Principal(思维题)
生活随笔
收集整理的這篇文章主要介紹了
Princess Principal(思维题)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述
阿爾比恩王國(the Albion Kingdom)潛伏著一群代號“白鴿隊(Team White Pigeon)”的間諜。在沒有任務的時候,她們會進行各種各樣的訓練,比如快速判斷一個文檔有沒有語法錯誤,這有助于她們鑒別寫文檔的人受教育程度。這次用于訓練的是一個含有n個括號的文檔。括號一共有mm種,每種括號都有左括號和右括號兩種形式。我們定義用如下的方式定義一個合法的文檔:
1.一個空的字符串是一個合法的文檔。
2.如果A,B都是合法的文檔,那么AB也是合法的文檔。
3.如果S是合法的文檔,那么aSb也是合法的文檔,其中a,b是同一種括號,并且a是左括號,b是右括號。
現在給出q個詢問,每次詢問只考慮文檔第ll至rr個字符的情況下,文檔是不是合法的。
輸入
第一行兩個整數n,m,q(1≤n,m,q≤106)。第二行有n個空格隔開的整數x,第i個整數xi(0≤xi<m?2)代表文檔中的第i個字符是第?x/2?種括號,且如果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題目大意:
? ? ? ? ? 給你的一段括號序列,需要注意的就是每一對括號都有一個權值,只有權值相對應的才是一對括號,然后給你q個詢問,讓你判斷給定詢問區間的括號序列是否合法
思路:
? ? ? ? ?判斷一段括號序列是合法的就要求每一個括號包含的是空或者是合法的括號序列,因此逐漸遞推的話,將那幾個中間為空的括號序列抵消掉之后可以將整個合法的括號序列抵消掉;
?
? ? ? ? ?因此我們可以用棧來處理匹配的括號,給每次進入的括號都賦一個值,這個值表示的是把當前棧中存在的合法的括號序列都抵消掉以后存在的棧頂的括號的下標。
?
? ? ? ? ?每次輸入的括號都與前一個相對比,如果能配對的話那就將前面那個括號彈出,如果不能配對就將這個括號推進去。
?
? ? ? ? ?最后我們可以通過對比我們要查詢的序列進棧之前的值和進棧之后的值是否相同來判斷這個括號序列是否合法。
#include<cstdio> #include<stack> using namespace std; stack<int> stk; int a[1000005]; int vis[1000005]; int Scan() { int res = 0, flag = 0; char ch; if ((ch = getchar()) == '-') { flag = 1; } else if(ch >= '0' && ch <= '9') {res = ch - '0'; }while ((ch = getchar()) >= '0' && ch <= '9') {res = res * 10 + (ch - '0'); }return flag ? -res : res; } int main() {int n,m,q;n=Scan();m=Scan();q=Scan();for(int i=1; i<=n; ++i)a[i]=Scan();for(int i=1; i<=n; ++i){if(stk.empty()){stk.push(i);vis[i]=stk.top();}else{int top=stk.top();if(a[top]+1==a[i]&&a[i]%2==1){stk.pop();if(stk.empty())vis[i]=0;else vis[i]=stk.top();}else{stk.push(i);vis[i]=stk.top();}}}for(int i=1; i<=q; ++i){int l,r;l=Scan();r=Scan();if(vis[l-1]==vis[r])puts("Yes");else puts("No");}return 0; }?
轉載于:https://www.cnblogs.com/nublity/p/9750840.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Princess Principal(思维题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深圳深科技待遇怎么样 待遇还算不错但薪酬
- 下一篇: 车辆保险怎么看是否到期