codeforces508E. Arthur and Brackets(贪心)

题目链接
大意:给你n个区间,第 i i i个区间 [ l i , r i ] [l_i,r_i] [li,ri]表示和第 i i i个左括号相匹配的右括号和这个左括号距离的范围。让你输出一种合法的序列。
思路:对于每一个右括号,和他相匹配的左括号肯定是离得最近的左括号。那么我们用栈进行模拟。对每个左括号先压入栈中,然后每次讨论栈顶元素,看是否可以放右括号,即栈顶元素的位置与放置右括号的位置满足这个左括号的区间要求。如果已经超过了范围就显然不成立,若还没到左区间的要求,就break.处理下一个左括号。
细节见代码

#include<bits/stdc++.h>

#define LL long long
#define fi first
#define se second
#define mp make_pair
#define pb push_back

using namespace std;

LL gcd(LL a,LL b){return b?gcd(b,a%b):a;}
LL lcm(LL a,LL b){return a/gcd(a,b)*b;}
LL powmod(LL a,LL b,LL MOD){LL ans=1;while(b){if(b%2)ans=ans*a%MOD;a=a*a%MOD;b/=2;}return ans;}
const int N = 2e5 +11;
stack<int>q;
int pos[N],n,cnt,l[N],r[N];
char ans[N];
int main(){
	ios::sync_with_stdio(false);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>l[i]>>r[i];
		pos[i]=cnt;
		ans[++cnt]='(';
		q.push(i);
		while(!q.empty()){
			int now=q.top();
			if(pos[now]+l[now]>cnt)break;
			if(pos[now]+r[now]<cnt){
				return cout<<"IMPOSSIBLE\n",0;
			}
			q.pop();
			ans[++cnt]=')';
		}
	}
	if(q.empty()){
		for(int i=1;i<=cnt;i++)cout<<ans[i];cout<<endl;
	}else cout<<"IMPOSSIBLE\n";
	return 0;
}
全部评论

相关推荐

Hello_WordN:咱就是说,除了生命其他都是小事,希望面试官平安,希望各位平时也多注意安全
点赞 评论 收藏
分享
10-14 13:25
已编辑
门头沟学院 C++
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务