1. 程式人生 > 實用技巧 >CF508E Arthur and Brackets(貪心+棧)(來自洛谷)

CF508E Arthur and Brackets(貪心+棧)(來自洛谷)

洛谷地址: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"); }