UOJ #31 【UR #2】猪猪侠再战括号序列
2017-05-18 09:41
190 查看
大家好我是来自百度贴吧的_叫我猪猪侠,英文名叫_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,否则会被判 00 分。
如果有多组方案,输出任意一组即可。
第一次操作后序列变为 “()()))((”。
第二次操作后序列变为 “()()(())”。
时间限制:1s1s
空间限制:256MB
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
贪心~
splay也能做……就是不知麻烦到哪里去了……
设'('==-1,')'==1,那么当now==0时,之前的括号都可以匹配。当now==1时,表示当前)比(多,一定要修改。所以我们线性扫一遍,记录now值,如果now==1,就从这里开始修改,直到修改到now==0的位置,记录一下然后扫完输出就可以了~
因为题目保证左右括号各n个,所以不存在无解的情况。
(我的程序是UOJ第二快~纪念一下~)
注意输入的字符串长度是2n的,小心RE!
我不曾上过大学,但这不影响我对离散数学、复杂性分析等领域的兴趣;尤其是括号序列理论,一度令我沉浸其中,无法自拔。至于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,否则会被判 00 分。
如果有多组方案,输出任意一组即可。
样例一
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 |
空间限制:256MB
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
贪心~
splay也能做……就是不知麻烦到哪里去了……
设'('==-1,')'==1,那么当now==0时,之前的括号都可以匹配。当now==1时,表示当前)比(多,一定要修改。所以我们线性扫一遍,记录now值,如果now==1,就从这里开始修改,直到修改到now==0的位置,记录一下然后扫完输出就可以了~
因为题目保证左右括号各n个,所以不存在无解的情况。
(我的程序是UOJ第二快~纪念一下~)
注意输入的字符串长度是2n的,小心RE!
#include<cstdio> #include<cstring> int n,now,ans[100001][3],tot; char ch[200001]; int main() { scanf("%s",ch+1); n=strlen(ch+1); for(int i=1;i<=n;i++) { now+=ch[i]=='(' ? -1:1; if(now==1) { ans[++tot][1]=i; for(i++;now;i++) now+=ch[i]=='(' ? -1:1; i--;ans[tot][2]=i; } } printf("%d\n",tot); for(int i=1;i<=tot;i++) printf("%d %d\n",ans[i][1],ans[i][2]); return 0; }
相关文章推荐
- UOJ #31. 【UR #2】猪猪侠再战括号序列
- uoj #31. 【UR #2】猪猪侠再战括号序列 贪心
- 【UOJ】【UR #2】猪猪侠再战括号序列(splay/贪心)
- UOJ 31 [UR #2]猪猪侠再战括号序列
- UOJ#31 【UR #2】猪猪侠再战括号序列
- BZOJ4350: 括号序列再战猪猪侠
- 【bzoj4350】括号序列再战猪猪侠 区间DP
- 【区间dp】括号序列再战猪猪侠
- [区间DP 思路题] BZOJ 4350 括号序列再战猪猪侠
- uoj problem 31 猪猪侠再战括号序列
- Bzoj4350 括号序列再战猪猪侠
- [BZOJ 4350]括号序列再战猪猪侠 题解(区间DP)
- 2017.10.7 括号序列 思考记录
- CodeVS3657 括号序列 解题报告【区间DP】
- 九度 题目1337:寻找最长合法括号序列
- 有效的括号序列
- 【google apec 20151a, 1b, 1c】 七段码,找奇路径或环,切割矩形; n数填m空组合数,倒酒杯,三连扑克消除,第k括号序列;挖矿、+*计算器、俄罗斯方块
- Java实现-有效的括号序列
- bzoj1095 [ZJOI2007]Hide 捉迷藏 括号序列/动态点分治/树的数据生成
- 有向树与树的括号序列最小表示法