UOJ#31 【UR #2】猪猪侠再战括号序列

传送门http://uoj.ac/problem/31

大家好我是来自百度贴吧的_叫我猪猪侠,英文名叫_CallMeGGBond。

我不曾上过大学,但这不影响我对离散数学、复杂性分析等领域的兴趣;尤其是括号序列理论,一度令我沉浸其中,无法自拔。至于OI算法竞赛,我年轻时确有参加,虽仅获一枚铜牌,但我素性淡泊,毫不在意,毕竟那所谓FFT、仙人掌之类,只是些雕虫小技罢了,登不上大雅之堂的;只有括号序列才会真正激发我的研究热情。

我曾天真地以为,凭借我的学识与才能,足可以在这世间安身立命;然而直到沦落街头后,我终才领悟现实的残酷。迫于生计,我只得转向道德与哲学的研究;但我与括号序列之间情愫依旧,难以剪断。

理性的传播总是不顺的,研究的道路也是曲折的,但轻易放弃决不是我的风格;为了继续实现自己的理想,现在我向大家提出一道括号序列的超级大难题。

有一个由 nn 个左括号 “(” 和 nn 个右括号 “)” 组成的序列。每次操作时可以选定两个数 l,rl,r,然后把第 ll 到第 rr 个括号的顺序翻转(括号的朝向保持不变)。例如将 “()((()(” 翻转第 33 到第 77 个括号后的结果为 “()()(((”。

我希望使用不超过 nn 次操作,将这个序列变为一个合法的括号序列。

众所周知,合法括号序列的定义如下:

  1. () 是合法括号序列;
  2. 如果 A 是合法括号序列,则 (A) 是合法括号序列;
  3. 如果 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 }
时间: 2024-10-22 00:29:02

UOJ#31 【UR #2】猪猪侠再战括号序列的相关文章

uoj #31. 【UR #2】猪猪侠再战括号序列 贪心

#31. [UR #2]猪猪侠再战括号序列 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/31 Description 大家好我是来自百度贴吧的_叫我猪猪侠,英文名叫_CallMeGGBond. 我不曾上过大学,但这不影响我对离散数学.复杂性分析等领域的兴趣:尤其是括号序列理论,一度令我沉浸其中,无法自拔.至于OI算法竞赛,我年轻时确有参加,虽仅获一枚铜牌,但我素性淡泊,毫不在意,毕竟那所谓FFT.仙人掌之类

【UOJ】【UR #2】猪猪侠再战括号序列(splay/贪心)

http://uoj.ac/problem/31 纪念伟大的没有调出来的splay... 竟然那个find那里写错了!!!!!!!!!!!!! 以后要记住:一定要好好想过! (正解的话我就不写了,太简单了.. #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <algorithm> #

[BZOJ 4350]括号序列再战猪猪侠 题解(区间DP)

[BZOJ 4350]括号序列再战猪猪侠 Description 括号序列与猪猪侠又大战了起来. 众所周知,括号序列是一个只有(和)组成的序列,我们称一个括号 序列S合法,当且仅当: 1.( )是一个合法的括号序列. 2.若A是合法的括号序列,则(A)是合法的括号序列. 3.若A,B是合法的括号序列,则AB是合法的括号序列. 我们考虑match[i]表示从左往右数第i个左括号所对应的是第几个右 括号,现在他得到了一个长度为2n的括号序列,给了你m个信息,第i 个信息形如ai,bi,表示match

Bzoj4350 括号序列再战猪猪侠

Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 97  Solved: 44 Description 括号序列与猪猪侠又大战了起来. 众所周知,括号序列是一个只有(和)组成的序列,我们称一个括号 序列S合法,当且仅当: 1.( )是一个合法的括号序列. 2.若A是合法的括号序列,则(A)是合法的括号序列. 3.若A,B是合法的括号序列,则AB是合法的括号序列. 我们考虑match[i]表示从左往右数第i个左括号所对应的是第几个右 括号,现在他得到了

再战斐波那契-Fibonacci+gcd

再战斐波那契 单点时限: 1.0 sec 内存限制: 512 MB 小z 学会了斐波那契和 gcd 后,老师又给他出了个难题,求第N个和第M个斐波那契数的最大公约数,这可难倒了小z ,不过在小z 的再三请求下,老师又告诉他了个条件,gcd(N,M)∈[1,90].可是,笨拙的小z 还是不会,于是请求你帮他解答这个问题. 输入格式: 输入包括 T 组,T∈[1,10]. 接下来 T 行,每行两个整数 N,M, 表示斐波那契的第 N 项和第 M 项,(N,M∈[1,1018]). 输出格式: 输出包

再战MFC中的消息机制

时间一长就忘记MFC中的很多东西了,所以需要把这些基本的知识理一理,为能深入到MFC内部结果原理,现在需要把这些东西让度娘吐出来: 1.MFC中的消息队列情况(一个消息队列可以容纳多少消息) 原文可以在msdn中搜索"About Messages and Message Queues "找到: The system maintains a single system message queue and one thread-specific message queue for each

从抗击SARS到再战新型冠状病毒,中国企业家如何抓住商机?

从抗击SARS到再战新型冠状病毒,中国企业家如何抓住商机?时间倒流17年前,中国遇到了前所未有的魔怔,它使我们惊慌失措,使我们失去了亲人和朋友,使我们企业关门,濒临倒闭.它就是"重症急性呼吸综合征-非典".绝望时刻,不少企业家迎难而上为这场看不见敌人的战争,捐赠物资和人力,给战役一场反击,使得企业转危为安,甚至蓬勃向上.京东如何战胜"SARS事件"据刘强东回忆到:我们也着急,怎么办呢?公司大概能支撑6个月,如果非典六个月之内不过去,京东就会面临第二次的倒闭.第一次就

数据结构(括号序列,线段树):ZJOI 2007 捉迷藏

[题目描述] Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条双向走廊组成,这N-1条走廊的分布使得任意两个屋子都互相可达. 游戏是这样进行的,孩子们负责躲藏,Jiajia负责找,而Wind负责操纵这N个屋子的灯.在起初的时候,所有的灯都没有被打开.每一次,孩子们只会躲 藏在没有开灯的房间中,但是为了增加刺激性,孩子们会要求打开某个房间的电灯或者关闭某个房间的电灯.为了评估某一次

九度oj 题目1337:寻找最长合法括号序列

题目描述: 给你一个长度为N的,由’(‘和’)’组成的括号序列,你能找出这个序列中最长的合法括号子序列么?合法括号序列的含义便是,在这个序列中,所有的左括号都有唯一的右括号匹配:所有的右括号都有唯一的左括号匹配.例如:((()))()()便是一个长度为10的合法括号序列,而(()))( 则不是. 需要你求解的是,找出最长的合法括号子序列的长度,同时找出具有这样长度的序列个数. 输入: 测试数据包括多个,每个测试数据包含两行: 第一行为一个整数N,其中N不会超过10^6. 第二行为一个长度为N的字