2209: [Jsoi2011]括号序列 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 833  Solved: 392[Submit][Status] Description Input 输入数据的第一行包含两个整数N和Q,分别表示括号序列的长度,以及操作的个数. 第二行包含一个长度为N的括号序列. 接下来Q行,每行三个整数t.x和y,分别表示操作的类型.操作的开始位置和操作的结 束位置,输入数据保证x不小于y.其中t=0表示询问操作.t=1表…
2209: [Jsoi2011]括号序列 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 1111  Solved: 541[Submit][Status][Discuss] Description Input 输入数据的第一行包含两个整数N和Q,分别表示括号序列的长度,以及操作的个数. 第二行包含一个长度为N的括号序列. 接下来Q行,每行三个整数t.x和y,分别表示操作的类型.操作的开始位置和操作的结 束位置,输入数据保证x不小于y.其中t=0表…
2209: [Jsoi2011]括号序列 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 1404  Solved: 699[Submit][Status][Discuss] Description Input 输入数据的第一行包含两个整数N和Q,分别表示括号序列的长度,以及操作的个数. 第二行包含一个长度为N的括号序列. 接下来Q行,每行三个整数t.x和y,分别表示操作的类型.操作的开始位置和操作的结 束位置,输入数据保证x不小于y.其中t=0表…
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2209 题解: Splay 很好的题,但是把智障的我给恶心到了...   首先不难发现,最后没有匹配的括号的样子一定是 ))))..((((... 即左边是右括号(设个数为nr),右边是做括号(设个数为nl) 则答案为 ⌈nl÷2⌉ + ⌈nr÷2⌉ (⌈ ⌉:向上取整)   若把 '(' 看成 1,把 ')' 看成 -1, 那么在这个只含有 1 和 -1 的序列里, 前缀最小值的相反数就等…
[BZOJ2329/2209][HNOI2011]括号修复/[Jsoi2011]括号序列 题解:我们的Splay每个节点维护如下东西:左边有多少多余的右括号,右边有多少多余的左括号,同时为了反转操作,还要维护左边有多少多余的左括号,右边有多少多余的右括号(如果一个右括号匹配一个左括号的话).然后xjb维护一番即可... 答案是什么呢?$\lceil{左边多余的右括号数\over 2}\rceil+\lceil{右边多余的左括号数\over 2}\rceil$. #include <cstdio>…
http://www.lydsy.com/JudgeOnline/problem.php?id=2209 splay又犯逗........upd1那里的sum忘记赋值反............. 本题好神..首先发现将所有能匹配的消掉后一定是类似这样的))))((((,当然也有((((((这种情况 还有本题将查询的区间长度都看做偶数..... 如果能知道有多少个)和多少个(,那么答案就是 )的个数除以2取上界+(的个数除以2取上界 很简单吧...... 所以我们只需要在splay维护从左边剩余的…
原文链接http://www.cnblogs.com/zhouzhendong/p/8093556.html 题目传送门 - BZOJ2209 题解 我太弱了,调出这题感觉都要吐了. 题解懒得写了. 给一个链接: http://blog.csdn.net/lych_cys/article/details/50700277 代码 #include <cstring> #include <cstdio> #include <algorithm> #include <c…
2329: [HNOI2011]括号修复 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 1007  Solved: 476[Submit][Status][Discuss] Description Input Output Sample Input Sample Output HINT Source Solution 一眼Splay么....关键是怎么维护... 一开始看错题了...想了很久歪路,其实想一下还是可以想到的么.. 对于一个括号序列,…
题目大意: 让你维护一个括号序列,支持 1.区间修改为同一种括号 2.区间内所有括号都反转 3.翻转整个区间,括号的方向不变 4.查询把某段区间变为合法的括号序列,至少需要修改多少次括号 给跪了,足足$de$了$3h$ 感觉这道题的思维难度比维修数列高多了 前三个操作都非常好搞,都是区间打标记 注意下推标记的顺序,子树根如果有区间覆盖标记,那么子树内所有节点的反转和翻转标记都失效了,要清空 而下传到同一节点的区间覆盖和反转翻转标记不冲突 我们下推标记时必须保证,下推后,两个子节点的状态拿来就能用…
把括号序列后一定是))))((((这种形式的..所以维护一个最大前缀和l, 最大后缀和r就可以了..答案就是(l+1)/2+(r+1)/2...用splay维护,O(NlogN). 其实还是挺好写的, 只是我傻X -------------------------------------------------------------------------------- #include<cstdio> #include<algorithm> #include<cstrin…
题目描述 一个合法的括号序列是这样定义的: 空串是合法的. 如果字符串 S 是合法的,则(S)也是合法的. 如果字符串 A 和 B 是合法的,则 AB 也是合法的. 现在给你一个长度为 N 的由‘('和‘)'组成的字符串,位置标号从 1 到 N.对这个字符串有下列四种操作: Replace a b c:将[a,b]之间的所有括号改成 c.例如:假设原来的字符串为:))())())(,那么执行操作 Replace 2 7 ( 后原来的字符串变为:)(((((()(. Swap a b:将[a,b]…
传送门 splay练习. 考虑把括号序列转化成类似于区间最大/最小值的情况. 显然我们可以知道括号序列消完的情况肯定是$a$个)和$b$个(,那么把这些括号全部合法化的代价显然就是$\frac{a+1}{2}+\frac{b+1}{2}$. 接着我们可以把'('变为1,把')'变为-1,然后每次取左区间的连续最小值,右区间的连续最大值,就是$a$与$b$的大小. 因为存在区间翻转,所以需要把左/右区间的连续最大/小值都搞出来. splay即可. //BZOJ2209 //by Cydiater…
3786: 星系探索 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 2191  Solved: 644[Submit][Status][Discuss] Description 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均有且仅有一个依赖星球.主星球没有依赖星球. 我们定义依赖关系如下:若星球a的依赖星球是b,则有星球a依赖星球b.此外,依赖关…
传送门 Solution 一道题花费了两天的时间-- 在大佬@PinkRabbit的帮助下,终于AC了,感动-- 首先,我们考虑一个括号序列被修改成合法序列需要的次数: 我们需要修改的其实是形如...)))))(((((... 我们把(看成是-1,把)看成是1,那么其实只要知道了区间的前缀最大值pr和后缀最小值sum-pr 那么就有\[ans=\left \lceil \frac{pr}{2} \right \rceil+\left \lceil \frac{-sum+su}{2} \right…
题目链接 题意:有一个长度为 \(n\) 的括号序列,你需要支持以下操作: 将 \([l,r]\) 中所有括号变为 \(c\) 将 \([l,r]\) 区间翻转 将 \([l,r]\) 区间中左括号变右括号,右括号变左括号 求最少需要改变多少个括号才能使得 \([l,r]\) 变成合法括号序列,保证区间长度为偶数. \(1 \leq n \leq 10^5\) 基础的 fhq-treap 的题目,主要练下放标记的技巧. 首先我们需要将要求的东西转化为一个式子.例如括号序列 \((())))))(…
BZOJ 洛谷 对树DFS得到括号序列.比如这样一个括号序列:[A[B[E][F[H][I]]][C][D[G]]]. 那比如\(D,E\)间的最短距离,就是将\(D,E\)间的括号序列取出:][[][]]][][,然后去掉其中匹配的括号,得到:]][[. 所以\(D,E\)在树上的最短距离为\(4\).因为左边一个右括号就表示向上一层,右边一个左括号就表示向下一层. 对一个区间记一个二元组\((a,b)\),表示该区间(去掉匹配括号后的)括号序列是]]..][..[,一共\(a\)个],\(b…
[题目]BZOJ 1095 [题意]给定n个黑白点的树,初始全为黑点,Q次操作翻转一个点的颜色,或询问最远的两个黑点的距离,\(n \leq 10^5,Q \leq 5*10^5\). [算法]括号序列+线段树 [题解]参考:konjac 括号序列其实就是入栈出栈序,每个点在进入时加左括号和点编号,退出时加右括号. 这样做的好处:两个点间的括号数(除去匹配的括号)就是两点间路径的长度. 除去匹配的括号后,容易发现两个点间的括号时")))((("的形式,右括号就是向上一条边,左括号就是向…
[BZOJ 4350]括号序列再战猪猪侠 Description 括号序列与猪猪侠又大战了起来. 众所周知,括号序列是一个只有(和)组成的序列,我们称一个括号 序列S合法,当且仅当: 1.( )是一个合法的括号序列. 2.若A是合法的括号序列,则(A)是合法的括号序列. 3.若A,B是合法的括号序列,则AB是合法的括号序列. 我们考虑match[i]表示从左往右数第i个左括号所对应的是第几个右 括号,现在他得到了一个长度为2n的括号序列,给了你m个信息,第i 个信息形如ai,bi,表示match…
题面: http://www.lydsy.com/JudgeOnline/problem.php?id=2329 思路: 显然,操作4中输出补全的最小费用是关键 这决定了我们不可能在splay上只维护1-2个值. 考虑一段括号序列,将其中所有合法序列删去以后,留下的一定是形如 ))))))((( 的序列 因此首先考虑将每段区间左侧不匹配的括号数和右侧不匹配的括号数记录下来,分别为 left[l,r] 和 right[l,r] 此时除了Invert操作以外已经可以满足 但是对于Invert操作,对…
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1095 [题意] 给定一棵树,树上颜色或白或黑而且可以更改,多个询问求最远黑点之间的距离. [思路] 括号序列+线段树 对树进行一遍dfs我们可以得到一个括号序列.如: [A[B[E][F[H][I]]][C][D[G]]]  E和G之间去掉匹配的括号和字母之后的串就是:  ]][[ 把它看作一个二元组(a,b)表示有a个]和b个[,而且这个二元组的形式一定是…]]]][[[…的,则E…
这个嘛= =链剖貌似可行,不过好像代码长度很长,懒得打(其实是自己太弱了QAQ)百度了一下才知道有一种高大上的叫括号序列的东西= = 岛娘真是太厉害了,先丢链接:http://www.shuizilong.com/house/archives/bzoj-1095-zjoi2007hide-%E6%8D%89%E8%BF%B7%E8%97%8F/ 这个括号序列貌似可以解决一些关于树上两点距离查询的问题(可以替代点分治?)好像很高端的样子找论文看看吧 CODE:(最近在搞github,相信不久就能够…
将各种情况绕环等看作括号序列,括号内的区域上下都需要累加答案,左右也是 f[i][j] 代表 前i个车站已经处理完的有j个左括号的最小权值 我们可以发现,更新的来源来自于 i-1, 和 i 将上 描述为L1,L2, 下描述为R1,R2,所以可以通过括号内的沿伸以及左右括号的答案更新状态 具体代码如下 #include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i<=y;i++) #define dec(i,x,y) fo…
大致题意: 给一棵树,每个节点最开始都是黑色,有两种操作,1.询问树中相距最远的一对黑点的距离 2.反转一个节点的颜色 一种做法: 建立出树的括号序列,类似这样: [A[B][C]],所以长度为3*n 假如我们要询问AC间的距离,提取出中间的括号:[]],匹配消去后得到],其长度就是距离. 现在我们要做的就是修改点的状态,并且动态维护答案.要用到一些求与绝对值相关的式子的技巧. /**********************************************************…
对于树的一个括号序列,树上两点的距离就是在括号序列中两点之间的括号匹配完之后的括号数... 由此可以得出线段树的做法.. #include<cstdio> #include<iostream> #define maxn 100000 #define inf (1<<25) using namespace std; ]; struct node{ int l1,l2,r1,r2,c1,c2,dis; void val(int x){ c1=c2=; l1=l2=r1=r2…
P1241 括号序列 题目描述 定义如下规则序列(字符串): 1.空序列是规则序列: 2.如果S是规则序列,那么(S)和[S]也是规则序列: 3.如果A和B都是规则序列,那么AB也是规则序列. 例如,下面的字符串都是规则序列: (),[],(()),([]),()[],()[()] 而以下几个则不是: (,[,],)(,()),([() 现在,给你一些由‘(’,‘)’,‘[’,‘]’构成的序列,你要做的,是找出一个最短规则序列,使得给你的那个序列是你给出的规则序列的子列.(对于序列a1,a2,……
找平衡树练习题的时候发现了这道神题,可以说这道题是近几年单考splay的巅峰之作了. 题目大意:给出括号序列,实现区间翻转,区间反转和区间更改.查询区间最少要用几次才能改成合法序列. 分析: 首先我们单看查询操作.不妨想象一下存在着一个栈,往里面入栈和出栈,那么从原序列中取出一对(),对应着一个入和一个出.那么当)的前面再也找不到(与之对应的时候,)就要被更改成(. 这有什么用呢?我们会发现,删除一对()对答案不具有影响.接着我们删除所有可以匹配的括号,得到一个))))))((((((这样的序列…
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2329 题解: Splay 类似 BZOJ 2329 [HNOI2011]括号修复 只是多了一个Replace(替换)操作, 然后就要主要lazy标记之间的影响了. 1).Replace可以直接覆盖另外两个标记, 2).当已经有Replace标记,再覆盖Invert标记时,直接把Replace标记取反即可;在覆盖Swap标记时,Replace标记不变. 代码: #include<cstdio…
题目描述 题解 Splay 由于有区间反转操作,因此考虑Splay. 考虑答案:缩完括号序列后剩下的一定是 $a$ 个')'+ $b$ 个'(',容易发现答案等于 $\lceil\frac a2\rceil+\lceil\frac b2\rceil$ . 怎么维护:区间合并,对于每个节点维护子树缩完括号序列后')'和'('的数目,然后pushup时考虑缩括号序列的过程,相应调整即可. 由于有Invent操作,因此还需要维护反括号序列缩完之后')'和'('的数目,并维护相应标记. 由于有Swap操…
题意:给你一个括号序列.操作1:询问需要更改多少个括号使之匹配. 操作2:反转序列,左括号变成右括号. 操作3:翻转序列,倒置. 标程: #include<cstdio> #include<algorithm> #include<cstring> #define ls son[k][0] #define rs son[k][1] using namespace std; ; ],rev[N],tag[N],n,t,l,r,sz[N],y,z,fa[N],Q,rt; ch…
Description 括号序列与猪猪侠又大战了起来. 众所周知,括号序列是一个只有(和)组成的序列,我们称一个括号 序列S合法,当且仅当: 1.( )是一个合法的括号序列. 2.若A是合法的括号序列,则(A)是合法的括号序列. 3.若A,B是合法的括号序列,则AB是合法的括号序列. 我们考虑match[i]表示从左往右数第i个左括号所对应的是第几个右 括号,现在他得到了一个长度为2n的括号序列,给了你m个信息,第i 个信息形如ai,bi,表示match[ai]<match[bi],要你还原这个…