UOJ#31 【UR #2】猪猪侠再战括号序列
传送门http://uoj.ac/problem/31
大家好我是来自百度贴吧的_叫我猪猪侠,英文名叫_CallMeGGBond。
我不曾上过大学,但这不影响我对离散数学、复杂性分析等领域的兴趣;尤其是括号序列理论,一度令我沉浸其中,无法自拔。至于OI算法竞赛,我年轻时确有参加,虽仅获一枚铜牌,但我素性淡泊,毫不在意,毕竟那所谓FFT、仙人掌之类,只是些雕虫小技罢了,登不上大雅之堂的;只有括号序列才会真正激发我的研究热情。
我曾天真地以为,凭借我的学识与才能,足可以在这世间安身立命;然而直到沦落街头后,我终才领悟现实的残酷。迫于生计,我只得转向道德与哲学的研究;但我与括号序列之间情愫依旧,难以剪断。
理性的传播总是不顺的,研究的道路也是曲折的,但轻易放弃决不是我的风格;为了继续实现自己的理想,现在我向大家提出一道括号序列的超级大难题。
有一个由 nn 个左括号 “(” 和 nn 个右括号 “)” 组成的序列。每次操作时可以选定两个数 l,rl,r,然后把第 ll 到第 rr 个括号的顺序翻转(括号的朝向保持不变)。例如将 “()((()(” 翻转第 33 到第 77 个括号后的结果为 “()()(((”。
我希望使用不超过 nn 次操作,将这个序列变为一个合法的括号序列。
众所周知,合法括号序列的定义如下:
- () 是合法括号序列;
- 如果 A 是合法括号序列,则 (A) 是合法括号序列;
- 如果 A,B 是合法括号序列,则 AB 是合法括号序列。
自从来到 UOJ 这个宝地,我的视野变得开阔了,也见识了更多富有人类智慧的人士。我相信各位一定能给我更加满意的答案!
输入格式
一行一个长度为 2n2n 的非空字符串表示初始序列。保证字符串只包含左括号和右括号,且左右括号的个数均为 nn。
输出格式
对于给出的字符串,输出调整成合法的括号序列的方案。如果不存在这样的方案输出一行一个整数 −1−1。
否则,第一行一个整数 mm 表示要进行 mm 次翻转操作。
接下来 mm 行每行两个整数 l,rl,r 表示要翻转区间 [l,r][l,r] 内的括号顺序。翻转操作会按你输出的顺序执行。
请保证 m≤nm≤n 以及 1≤l≤r≤2n1≤l≤r≤2n,否则会被判 0 分。
如果有多组方案,输出任意一组即可。
样例一
input
)))()(((
output
2 1 6 5 8
explanation
第一次操作后序列变为 “()()))((”。
第二次操作后序列变为 “()()(())”。
限制与约定
测试点编号 | nn的规模 |
---|---|
1 | n≤4n≤4 |
2 | n≤100n≤100 |
3 | |
4 | |
5 | |
6 | n≤100000n≤100000 |
7 | |
8 | |
9 | |
10 |
时间限制:1s1s
空间限制:256MB
扫描 构造 脑洞题
显然最方便的结果是((()))的形式。
维护双指针扫描,head指向第一个右括号,tail指向head后面的第一个左括号,每步将两个位置的括号交换。
显然是 $ O(n) $的
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 char s[200010]; 6 int ans=0,L[100010],R[100010]; 7 int main(){ 8 int i; 9 scanf("%s",s+1); 10 int n=strlen(s+1); 11 int hd=1; 12 for(i=1;i<=n;i++){ 13 if(s[i]=='('){ 14 while(hd<i && s[hd]!=')')hd++; 15 if(hd^i){ 16 swap(s[hd],s[i]); 17 ans++; 18 L[ans]=hd;R[ans]=i; 19 } 20 } 21 } 22 printf("%d\n",ans); 23 for(i=1;i<=ans;i++){ 24 printf("%d %d\n",L[i],R[i]); 25 } 26 return 0; 27 }
转载于:https://www.cnblogs.com/SilverNebula/p/7061334.html
UOJ#31 【UR #2】猪猪侠再战括号序列相关推荐
- UOJ #31 【UR #2】猪猪侠再战括号序列
大家好我是来自百度贴吧的_叫我猪猪侠,英文名叫_CallMeGGBond. 我不曾上过大学,但这不影响我对离散数学.复杂性分析等领域的兴趣:尤其是括号序列理论,一度令我沉浸其中,无法自拔.至于OI算法 ...
- [UOJ #31]【UR #2】猪猪侠再战括号序列
题目大意:给你一个长度为$2n$的括号序列,保证$n$个`(`,$n$个`)`.要求输出一种可行方案,通过小于等于$n$的步数,每次交换区间$[x_i,y_i]$(立即交换),使得最后括号序列合法 题 ...
- uoj problem 31 猪猪侠再战括号序列
题目大意: 给定一个长度为2n的括号序列.定义一个关于区间[l,r]的翻转操作为位置平移对调. 即翻转")))()("可以得到"()()))((" 用不超过n次 ...
- 【UR #2】猪猪侠再战括号序列
---恢复内容开始--- 大概就是判断合法的括号序列的问题,进行翻转使其成为合法的括号序列. 1.前缀和的做法:非常妙啊,左括号和右括号分别即为1和-1,合法的组合累加和一定为非负数,而不合法的情况就 ...
- UOJ#31. 【UR #2】猪猪侠再战括号序列 splay
显然可以直接凑左面全是左括号,右面全是右括号的情况. 然后区间翻转就用 splay 模拟好了. splay 的时候一定注意一点: 如果没有调用 find(x),就一定要手动把 x 及其祖先的节点 pu ...
- UOJ #31. 【UR #2】猪猪侠再战括号序列
1e5 不一定是nlogn 也可能是o(n) 事实上如果是 1e6 o(n)会跑好久 然后题目中的限制有很大的用处 : nn 个左括号 "(" 和 nn 个右括号 ")& ...
- 【UR #2】 猪猪侠再战括号序列
SOL: 我们用平衡树维护就好啦. // getlazy #include<bits/stdc++.h> using namespace std; inline int rop() {st ...
- [BZOJ 4350]括号序列再战猪猪侠 题解(区间DP)
[BZOJ 4350]括号序列再战猪猪侠 Description 括号序列与猪猪侠又大战了起来. 众所周知,括号序列是一个只有(和)组成的序列,我们称一个括号 序列S合法,当且仅当: 1.( )是一个 ...
- bzoj4350 括号序列再战猪猪侠
Description 括号序列与猪猪侠又大战了起来. 众所周知,括号序列是一个只有(和)组成的序列,我们称一个括号 序列S合法,当且仅当: 1.( )是一个合法的括号序列. 2.若A是合法的括号序列 ...
最新文章
- 计算机专业3d游戏设计,史塔福郡大学3D计算机游戏设计理学硕士研究生申请要求及申请材料要求清单...
- Jenkins 在Windows下插件无法安装问题解决
- linux内存源码分析 - 伙伴系统(初始化和申请页框)
- 好用的开源软件_推荐_良心软件
- oracle exadata效果,exadata成功案例与性能测试-oracle.pdf
- 服务器安装Ubuntu Server 18.04及磁盘分区
- 软考-架构师知识总结
- 测试用例的评审和变更
- 蓝桥杯 真题:明码 一题掌握3种码
- IDEA警告:SQL dialect is not configured
- 2022年,建议你一定要读的10本网络安全书籍
- 关于AD9361的抗阻塞能力 的实测
- Linux输出“Argument list too long”的解决方法
- Python之图形用户界面--GUI
- GO语言的实战学习(猜谜游戏和在线词典)| 青训营笔记
- 上海积分落户计算机水平加分,2019年上海应届生落户打分72分标准拿分策略
- 2022新版Git教程 从入门到实战(一)安装Git
- 【GAN】是什么让GAN成为了这5年里深度学习领域最亮的崽?
- 免费、好用的SQL可视化工具HeidiSQL
- 拿来吧你!CISP-PTE渗透基础测试题自测
热门文章
- mysql sum函数返回类型_MySQL的sum函数返回的门类
- linux 搜索命令 历史,Linux 控制台神器:搜索历史命令 Ctrl + R ( ctrl + r to search the history command )...
- elasticsearch初次查询超时_ElasticSearch的工作流程
- java jdbc 操作_Java:JDBC操作
- linux延迟绑定,php延迟绑定和非延迟绑定解析
- linux tcb,在Linux中从潜藏密码迁移至tcb怎么做?
- 大学计算机基础试题 选择题,大学计算机基础试题选择题
- 基于matlab的图解粒度参数计算,基于MATLAB的图解粒度参数计算
- git revert和reset区别
- 如何保证对象的唯一性