[BZOJ2329/2209][HNOI2011]括号修复/[Jsoi2011]括号序列 题解:我们的Splay每个节点维护如下东西:左边有多少多余的右括号,右边有多少多余的左括号,同时为了反转操作,还要维护左边有多少多余的左括号,右边有多少多余的右括号(如果一个右括号匹配一个左括号的话).然后xjb维护一番即可... 答案是什么呢?$\lceil{左边多余的右括号数\over 2}\rceil+\lceil{右边多余的左括号数\over 2}\rceil$. #include <cstdio>…
题目链接 题意:有一个长度为 \(n\) 的括号序列,你需要支持以下操作: 将 \([l,r]\) 中所有括号变为 \(c\) 将 \([l,r]\) 区间翻转 将 \([l,r]\) 区间中左括号变右括号,右括号变左括号 求最少需要改变多少个括号才能使得 \([l,r]\) 变成合法括号序列,保证区间长度为偶数. \(1 \leq n \leq 10^5\) 基础的 fhq-treap 的题目,主要练下放标记的技巧. 首先我们需要将要求的东西转化为一个式子.例如括号序列 \((())))))(…
传送门 Solution 一道题花费了两天的时间-- 在大佬@PinkRabbit的帮助下,终于AC了,感动-- 首先,我们考虑一个括号序列被修改成合法序列需要的次数: 我们需要修改的其实是形如...)))))(((((... 我们把(看成是-1,把)看成是1,那么其实只要知道了区间的前缀最大值pr和后缀最小值sum-pr 那么就有\[ans=\left \lceil \frac{pr}{2} \right \rceil+\left \lceil \frac{-sum+su}{2} \right…
题面 传送门 题解 写了一下\(FHQ\ Treap\) //minamoto #include<bits/stdc++.h> #define R register #define inline __inline__ __attribute__((always_inline)) #define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i) #define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i) #…
洛谷题面传送门 又是一道我不会的代码超短的题( 一开始想着用生成函数搞,结果怎么都搞不粗来/ll 首先不妨假设音阶之间存在顺序关系,最终答案除以 \(m!\) 即可. 本题个人认为一个比较亮的地方在于,每个音阶被奏响次数都是偶数这个条件的处理方式.由于是奇偶性,我们可以发现如果我们钦定了其中 \(m-1\) 个片段对应的音阶集合,那么第 \(m\) 个片段中的音阶集合一定已经确定了.我们考虑从这个性质入手.设 \(dp_i\) 表示有多少个包含 \(i\) 个片段且符合要求的音阶集合,那么我们考…
题目描述 一个合法的括号序列是这样定义的: 空串是合法的. 如果字符串 S 是合法的,则(S)也是合法的. 如果字符串 A 和 B 是合法的,则 AB 也是合法的. 现在给你一个长度为 N 的由‘('和‘)'组成的字符串,位置标号从 1 到 N.对这个字符串有下列四种操作: Replace a b c:将[a,b]之间的所有括号改成 c.例如:假设原来的字符串为:))())())(,那么执行操作 Replace 2 7 ( 后原来的字符串变为:)(((((()(. Swap a b:将[a,b]…
原题链接点这里 今天在课上听到了这个题,听完后觉得对于一道\(DP\)题目来说,好的状态定义就意味着一切啊! 来看题: 题目描述 为了在即将到来的晚会上有更好的演出效果,作为AAA合唱队负责人的小A需要将合唱队的人根据他们的身高排出一个队形.假定合唱队一共N个人,第i个人的身高为Hi米(1000<=Hi<=2000),并已知任何两个人的身高都不同.假定最终排出的队形是A 个人站成一排,为了简化问题,小A想出了如下排队的方式:他让所有的人先按任意顺序站成一个初始队形,然后从左到右按以下原则依次将…
题目传送门 数学作业 题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N和 M,要求计算 Concatenate (1 .. N)Mod M 的值,其中 Concatenate(1..N) 是将所有正整数1,2,…,N 顺序连接起来得到的数.例如,N=13 , Concatenate (1 .. N)=12345678910111213 .小C 想了大半天终于意识到这是一道不可能手算出来的题目,于是他只好向你求助,希望你能编写一个程序帮他解决这个问题.…
最近学了矩阵,kzj大佬推荐了我这一道题目. 乍一眼看上去,没看出是矩阵,就随便打了一个暴力,30分. 然后仔细分析了一波,发现蛮简单的. 结果全wa了,先看看下面的错误分析吧! 首先,设f[n]为最终答案,易得出\[ f[n]=f[n-1]*10+n\] 然后魔改一下:\[ f[n]=f[n-1]*10+n-1 => \] \[\begin{matrix} 10&0&0\\ 1&1&0\\ 1&1&1\\ \end{matrix}\] 信心一波过样例…
传送门 高斯消元还是一如既往的难打……板子都背不来……Kelin大佬太强啦 不知道大佬们是怎么发现可以按位考虑贡献,求出每一位是$1$的概率 然后设$f[u]$表示$u->n$的路径上这一位为$1$的概率,然后设$deg[u]$表示$u$的出度 那么$1-f[u]$就是路径上这一位为$0$的概率 然后瞎推可以得到$$f[u]=\frac1{dg[u]}(\sum_{w(u,v)=0}f[v]+\sum_{w(u,v)=1}1-f[v])$$$$ dg[u]f[u]=\sum_{w(u,v)=0}…
题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N 和 M,要求计算 Concatenate (1 .. N) Mod M 的值,其中 Concatenate (1 ..N)是将所有正整数 1, 2, -, N 顺序连接起来得到的数.例如,N = 13, Concatenate (1 .. N)=12345678910111213.小C 想了大半天终于意识到这是一道不可能手算出来的题目,于是他只好向你求助,希望你能编写一个程序帮他解决这个问题. 输入输…
想法 最初的想法就是记录当前 \(%m\) 值为cur,到下一个数时 \(cur=cur \times 10^x + i\) n这么大,那就矩阵乘法呗. 矩阵乘法使用的要点就是有一个转移矩阵会不停的用到. 那么这道题中,1~n中所有位数相同的数转移矩阵都相同. \[ \begin{bmatrix} ans & i &1 \end{bmatrix} \begin{bmatrix} 10^x & 0 & 0 \\ 1 & 1 & 0 \\ 1 & 1 &…
https://www.luogu.org/problemnew/show/P1020 (原题链接) 第一问就是求最长不上升子序列的长度,自然就想到了c++一本通里动态规划里O(n^2)的算法,但题目明确说明“为了让大家更好地测试n方算法,本题开启spj,n方100分,nlogn200分每点两问,按问给分”,自然是要写O(nlogn)的算法才能AC哦. 对于这种nlogn的算法,只能求出长度,不能求出具体的序列.这种算法实现过程如下: 我们定义len为到目前为止最长不上升子序列的长度,d[l]表…
正解:线段树合并 解题报告: 传送门! 这题也是有很多解法,eg:splay,treap,... 然而我都不会我会学的QAQ! 反正今天就只讲下线段树合并怎么做QAQ 首先看到这样子的说第k重要的是什么,然后又不是问某个区间内,那就肯定是权值线段树做嘛 然后考虑到连桥,那显然就是并茶几维护连通性,然后如果不在一个块的连起来了就线段树合并一下就好了嘛 然后就麻油辣!overr! 大概就这些趴,细节什么的瞎扯一点晚上写QAQ #include<bits/stdc++.h> using namesp…
[题目背景:] 原题cf13c 数据加强版(就是说原来能用DP做现在不行了QwQ) [题目描述:] 给定一个序列,每次操作可以把某个数+1-1.要求把序列变成非降数列.而且要求修改后的数列只能出现修改前的数. [输入格式:] 第一行输入一个n,表示有n( n \leq 5*10^5n≤5∗105 )个数字.第二行输入n个整数,整数的绝对值不超过 10^9109 [输出格式:] 输出一个数,表示最少的操作次数 [算法分析:] 切题背景:chen_zhe大佬改编了这道题目之后吸引了slyz准高一全机…
传送门 本来打算用主席树 然后发现没办法维护颜色数 于是用了莫队加树状数组 然后竟然A了…… //minamoto #include<iostream> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==…
链接: P4867 题意: 给出长度为 \(n(1\leq n\leq 10^5)\) 的序列 \(s\),保证\(1\leq s_i\leq n\).有 \(m(1\leq m\leq 10^6)\) 次询问,每次询问给出 \(4\) 个整数 \(l,r,a,b(1\leq l\leq r\leq n,1\leq a\leq b\leq n)\),询问在 \([l,r]\) 的序列中有多少种权值属于 \([a,b]\). 分析: 感觉这道题和数颜色有一点像,区别是有值域的范围限制.看操作可以离…
把括号序列后一定是))))((((这种形式的..所以维护一个最大前缀和l, 最大后缀和r就可以了..答案就是(l+1)/2+(r+1)/2...用splay维护,O(NlogN). 其实还是挺好写的, 只是我傻X -------------------------------------------------------------------------------- #include<cstdio> #include<algorithm> #include<cstrin…
题链: 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…
http://www.lydsy.com/JudgeOnline/problem.php?id=2329 需要改变的括号序列一定长这样 :)))((( 最少改变次数= 多余的‘)’/2 [上取整] + 多余的‘(’ /2 [上取整] 把 ‘)’ 看做1,‘(’ 看做-1 那么最少改变次数=最大前缀和/2 [上取整]+ 最小后缀和/2 [上取整] 覆盖标记的优先级高于翻转标记和取反标记 即下放覆盖标记时,同时清空翻转标记和取反标记 且先下放覆盖标记 翻转: 最大前缀和 和 最大后缀和 交换 最小前…
洛谷AC通道 本题,题目长,但是实际想起来十分简单. 首先,对于树上的每一个后括号,我们很容易知道,他的贡献值等于上一个后括号的贡献值 + 1.(当然,前提是要有人跟他匹配,毕竟题目中要求了,是不同的子串.) 那么,如何记录是否有人跟他匹配??  也很好想...  用一个栈来维护(同时也方便我们记录上一个后括号所在的位置.) 那么,求总贡献值呢??  更好办了.  直接等于他爸爸 + 他自己的呗!! 结束了~~~ #include <bits/stdc++.h> using namespace…
题面: http://www.lydsy.com/JudgeOnline/problem.php?id=2329 思路: 显然,操作4中输出补全的最小费用是关键 这决定了我们不可能在splay上只维护1-2个值. 考虑一段括号序列,将其中所有合法序列删去以后,留下的一定是形如 ))))))((( 的序列 因此首先考虑将每段区间左侧不匹配的括号数和右侧不匹配的括号数记录下来,分别为 left[l,r] 和 right[l,r] 此时除了Invert操作以外已经可以满足 但是对于Invert操作,对…
题目大意: 让你维护一个括号序列,支持 1.区间修改为同一种括号 2.区间内所有括号都反转 3.翻转整个区间,括号的方向不变 4.查询把某段区间变为合法的括号序列,至少需要修改多少次括号 给跪了,足足$de$了$3h$ 感觉这道题的思维难度比维修数列高多了 前三个操作都非常好搞,都是区间打标记 注意下推标记的顺序,子树根如果有区间覆盖标记,那么子树内所有节点的反转和翻转标记都失效了,要清空 而下传到同一节点的区间覆盖和反转翻转标记不冲突 我们下推标记时必须保证,下推后,两个子节点的状态拿来就能用…
题目: 题目链接:https://www.luogu.org/problem/P5658?contestId=24103 本题中合法括号串的定义如下: () 是合法括号串. 如果 A 是合法括号串,则 (A) 是合法括号串. 如果 A,B 是合法括号串,则 AB 是合法括号串. 本题中子串与不同的子串的定义如下: 字符串 S 的子串是 S 中连续的任意个字符组成的字符串.S 的子串可用起始位置 \(l\) 与终止位置 \(r\) 来表示,记为 \(S (l, r)\)(\(1 \leq l \l…
题目 洛谷 4424 分析 感觉思路比较神仙. 对于按位与和按位或两种运算,显然每一位是独立的,可以分开考虑. 对于某一位,「与 \(0\)」会将这一位变成 \(0\),「或 \(1\)」会将这一位变成 \(1\) ,「与 \(1\)」和「或 \(0\)」不会改变这一位的值.前两种操作会改变这一位的值,而后两种不会.将前两种称为「关键操作」,那么某一位最终的值取决且仅取决于这一位的最后一次「关键操作」是「与 \(0\)」还是「或 \(1\)」.如果是前者或者不存在关键操作,最终的值就是 \(0\…
链接: P5658 分析: 显然我们应该在dfs树的同时维护每个点的答案. 注意到第 \(u\) 个点的答案可以分成两部分,不包含 \(u\) 点时的答案,和加入 \(u\) 点后新增的答案,前者可以从父节点继承下来,所以我们对于每个点考虑的是加入该点后新增的答案. 在dfs树时会回溯,所以我们还需要考虑撤销这个点带来的影响. 所以我们实际要做的就是思考出一种策略,使其能够对新加入的点维护出新增的答案,还能将这个点的影响撤销. 算法: 对于一个点,我们分类讨论左括号和右括号的两种操作. 对于加入…
题面传送门 emmmm----怎么评价这个题嘛...感觉纯论算法,此题根本谈不上难题,不过 WC 时候太智障只拿了个 48pts 就走人了.总之,技不如人,甘拜吓疯( 首先要注意到几件事情: 如果 \((x,y)\) 间存在合法的括号序列,那么 \((y,x)\) 之间也存在合法的括号序列,因为把一个路径反过来实际上相当于把括号序列翻转过来,并且左括号变右括号,右括号变左括号. 如果 \((x,y),(y,z)\) 之间存在合法的括号序列,那么 \((x,z)\) 之间也存在合法的括号序列. 我…
[BZOJ2329]括号修复(Splay) 题面 BZOJ 洛谷 题解 本来想着用线段树来写 但是有一个区间翻转 所以不能用线段树了,就只能用平衡树 然后直接\(Splay\)就好了 注意一下几个标记的下放问题 这种数据结构真的没有什么思路可言.. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<…
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么....关键是怎么维护... 一开始看错题了...想了很久歪路,其实想一下还是可以想到的么.. 对于一个括号序列,…
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表…