【链接】 我是链接,点我呀:)

【题意】

在这里输入题意

【题解】

所给的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;
}

最新文章

  1. Arduino下LCD1602综合探究(上)——1602的两种驱动方式,如何使LCD的控制编程变得更简单
  2. HTML基本组成结构与标签的认识
  3. [Android Pro] Android打包一个Apk后,如何查看它的VersionCode、VersionName 等等。
  4. IIS7报错
  5. java-web乱码问题解决
  6. sprint3(第四天)
  7. C# 字符串计算表达式
  8. 行为类模式(一):职责链(Chain Of Responsibility)
  9. 远离go path,弃用go get,使用go mod 进行go语言的学习
  10. python3_list
  11. js encode方法
  12. chrome-performance页面性能分析使用教程
  13. 使用 Spring 2.5 注释驱动的 IoC 功能
  14. BZOJ 3609: [Heoi2014]人人尽说江南好
  15. centos6.5安装maridb5.5.51
  16. paip.分布式应用系统java c#.net php的建设方案
  17. Flask 使用富文本输入框
  18. java Object对象的clone方法
  19. Oracle sql loader 使用案例
  20. Redis中RedisTemplate和Redisson管道的使用

热门文章

  1. 【BZOJ4016】【FJOI2014】最短路径树问题
  2. Java默认方法
  3. 斗地主算法的设计与实现(一)--项目介绍&amp;如何定义和构造一张牌
  4. 【BZOJ 1192】[HNOI2006]鬼谷子的钱袋
  5. Oracle学习总结(7)—— 常用的数据库索引优化语句总结
  6. POJ——T3352 Road Construction
  7. wsimport 使用方法具体解释
  8. Mysql信息数据库:Information_schema
  9. java关键字之transient
  10. Copying