CF508E Arthur and Brackets(貪心+棧)(來自洛谷)
阿新 • • 發佈:2020-08-05
洛谷地址:https://www.luogu.com.cn/problem/CF508E
題意:
給出n對L,R
第i個左括號,與它匹配的右括號與左括號的距離範圍為:[L,R]
求是否有序列滿足,否則:IMPOSSIBLE
解析:
看了不少題解,勉強搞懂。
對於括號匹配問題,應該優先想到棧。因為括號的匹配符合先進後出,所以用stack來進行模擬。
棧頂的括號進行優先匹配,
如果它的左括號位置+L>cnt,位置留下,供下一個左括號使用。
左括號位置+R<cnt,已經沒有多餘位置匹配右括號了,這個時候一定不滿足條件。
#include<iostream> #include<cstring> #include<stack> using namespace std; typedef long long ll; const int maxn=605; int l[maxn],r[maxn]; char ch[3*maxn]; int pos[maxn]; int main() { int n; scanf("%d",&n); memset(pos,0,sizeof(pos)); stack<int>s; int cnt=0,ok=0; for(int i=1;i<=n;i++) { scanf("%d%d",&l[i],&r[i]); pos[i]=cnt; ch[cnt++]='('; s.push(i); while(!s.empty()) { int u=s.top(); if(l[u]+pos[u]>cnt) break; if(r[u]+pos[u]<cnt) { ok=1;break; } ch[cnt++]=')'; s.pop(); } } if(!ok&&s.empty()) printf("%s\n",ch); else printf("IMPOSSIBLE\n"); }