【Henu ACM Round#20 F】 Arthur and Brackets
2024-10-01 16:50:20
【链接】 我是链接,点我呀:)
【题意】
在这里输入题意
【题解】
所给的li,ri是左括号从左到右的顺序给的。
(且注意长度是2*n
现在我们先把第一个左括号放在第1个位置。
然后考虑第二个位置。
如果这个位置能放右括号和第一个匹配(位置满足在1+l[i]..1+r[i]之间.
那么我们就在第二个位置放一个右括号就好了。
(如果我们作死不放右括号的话,那就只能放左括号了->一定要放一个括号的
那么我们就只能先匹配这一个左括号了,而前一个左括号可能在第3个位置就不能匹配了。
这就会造成错解。
也就是说当前栈顶的左括号是当前需要匹配的括号。不能跳过它。那么我们的原则肯定就是赶快把它匹配了。
越拖到后面,就越没机会匹配。
(所以能和之前的某个括号匹配,就一直匹配
而如果这个位置不能匹配。
那么没办法。
只好放一个左括号在这个地方了。
然后优先匹配新加进去的这个左括号。
如果当前的位置已经大于上界了。
那么就直接输出无解。
如果还有没匹配到的左括号。
也输出无解。
【代码】
#include<bits/stdc++.h>
using namespace std;
const int N = 600;
int n,l[N+10],r[N+10],pos[N+10];
stack<int> sta;
vector<char> ans;
int main()
{
cin >>n;
for (int i = 1;i <= n;i++){
cin >> l[i] >> r[i];
}
int now = -1;
for (int i = 1;i <= n;i++){
sta.push(i);
pos[i] = ++now;
ans.push_back('(');
while (!sta.empty()){
int top = sta.top();
if (pos[top]+l[top]<=now+1 && now+1<=pos[top]+r[top]){
sta.pop();
ans.push_back(')');
++now;
}else if (now+1>pos[top]+r[top]){
return cout<<"IMPOSSIBLE"<<endl,0;
}else break;
}
}
if (!sta.empty()) return cout<<"IMPOSSIBLE"<<endl,0;
for (char key:ans)
cout<<key;
return 0;
}
最新文章
- Arduino下LCD1602综合探究(上)——1602的两种驱动方式,如何使LCD的控制编程变得更简单
- HTML基本组成结构与标签的认识
- [Android Pro] Android打包一个Apk后,如何查看它的VersionCode、VersionName 等等。
- IIS7报错
- java-web乱码问题解决
- sprint3(第四天)
- C# 字符串计算表达式
- 行为类模式(一):职责链(Chain Of Responsibility)
- 远离go path,弃用go get,使用go mod 进行go语言的学习
- python3_list
- js encode方法
- chrome-performance页面性能分析使用教程
- 使用 Spring 2.5 注释驱动的 IoC 功能
- BZOJ 3609: [Heoi2014]人人尽说江南好
- centos6.5安装maridb5.5.51
- paip.分布式应用系统java c#.net php的建设方案
- Flask 使用富文本输入框
- java Object对象的clone方法
- Oracle sql loader 使用案例
- Redis中RedisTemplate和Redisson管道的使用