03 2018 档案
摘要:"luogu" sol 显然$Q$那么大而$n$又那么小就一定是$O(n^2)$预处理然后每个询问$O(1)$回答就好了。 枚举每个起点然后一个一个往后面插入。 所有的回文子串的个数? 记录一下回文树上的$dep$,那么每插入一个字符以后新增的贡献就是$last$节点的$dep$值。 code cp
阅读全文
摘要:"bzoj" sol 首先求出以每个位置结尾的最长回文后缀长度。 然后你实际上就是要求:对于一个长度为$4$的倍数的回文子串,是否存在一个长度为他的一半的回文后缀。 这个可以沿后缀树$dfs$一遍。因为一个回文子串的所有回文后缀一定都是他在回文树上的祖先。 code cpp include incl
阅读全文
摘要:回文树总结 写马拉车还不如写回文树。 BY 陈菊开 回文树是啥 原论文请转2017年集训队论文《回文树及其应用》BY翁文涛 我感觉回文树/回文自动机相较于后缀自动机还是要好理解一点的(像我这种菜鸡到现在还不是很懂SAM)。 回文树,顾名思义,就是要把一个串的所有回文子串丢到一棵树上。那要向SAM一样
阅读全文
摘要:"luogu" sol 震惊!$NOIP$居然也出数据结构! 话说回来,其实只需要对每一行的前$m 1$个人维护一个数据结构,然后对最后一列的$m$个人也维护一个数据结构就好了。具体的话写平衡树就可以了。 那么对于一次$(x,y)$的操作,其实就是先把最后一列的第$y$个元素丢到第$x$行里面,再查
阅读全文
摘要:"bzoj" "luogu" 题意 给你一张含有一条哈密顿回路的无向图(哈密顿回路就是经过每个店恰好一次),判断这张图是不是平面图(平面图就是可以画在平面上使边不相交)。 sol 首先有一个 平面图定理 :一张平面图的边数不超过$3N 6$(其中$N$是点数) 这样就把边数降到了$O(n)$级别。
阅读全文
摘要:"bzoj" "luogu" 题意 就是要在一个只含$a,b$的字符串中选取一个子序列,使得: 1、位置和字符都关于某条对称轴对称。 2、不能是连续的一段。 求方案数模$10^9+7,n\le10^5$ sol 其实就是对于任意一个对称中心,你算出关于它对称的有多少位置,假设是$f_i$那么一个对称
阅读全文
摘要:"bzoj" "luogu" "uoj" 题意 有一棵$LCT$,给出每个点的$access$次数,求一个最优的$access$操作顺序使得重轻链切换的次数最多。 sol ~~像我这种外省酱油选手在考场上当然只有10分暴力分~~ 有没有人像我一样在考场上想到 "[SDOI2017]树点涂色" 然而依
阅读全文
摘要:"bzoj" "加强版" sol 其实前一题还有一种解法的,具体方法请见bzoj讨论版。 以下是正解(?) 建一棵生成树。 考虑什么时候图会不连通:当且仅当存在一条树边被删除,同时所有覆盖了他的非树边也被删除。 所以考虑给每条非树边随机一个权值,然后把每条树边的权值设为所以覆盖了这条边的非树边的边权
阅读全文
摘要:"vjudge" 题意 有$n$张卡片,每一次你有$p_i$的概率买到第$i$张卡。求买到所有卡的期望购买次数。 $n\le20,\sum p_i\le1$ sol $n\le20$那就一定是状压了吧。 设$f_s$表示已经买到了集合$s$后的期望购买次数。显然转移方程式长这样: $f_s=\sum
阅读全文
摘要:"vjudge" 题意 $m$面骰子,求 1.连续出现$n$个相同的停止; 2.连续出现$n$个不同的停止 的期望投骰子次数。 $n,m ≤ 10^6$ sol 首先考虑一个转移式子吧。 设$f_i,g_i$分别表示已经连续出现了$i$个相同/不同时的期望步数: $$f_i=\frac 1mf_{i
阅读全文
摘要:"vjudge" 题意 有$n$对新人在同一天结婚。$John$作为小镇上唯一的神父(牧师?)需要去给每一场婚礼搞一个仪式。第$i$场婚礼的持续时间是$S_i$到$T_i$,仪式可以安排在婚礼的前$D_i$分钟也可以安排在后$D_i$分钟举办。已知$John$可以从一个婚礼现场瞬移到另一个婚礼现场,
阅读全文
摘要:"vjudge" 题意 有一个$1 N$的棋盘,双方轮流在棋盘上下棋,先形成三个连续棋子者胜。 $N\le2000$ sol 还是要转换成“不能操作者败”的问题。 如果一方在格子$i$上下了一个棋,那么$i 2,i 1,i+1,i+2$(如果有的话)这些格子一定再也不能下了(因为你一下对方就赢了)
阅读全文
摘要:"vjudge" 题意 有一张$W H$大小的网格纸,每个人每次可以选择一块纸片沿任意一条网格线剪开,先剪出$1 1$大小方格者胜。 问是否先手必胜。$2\le W,H\le200$ sol 首先,像这样“谁先balabala”的问题是不能直接用$SG$函数去做的。 考虑一下问题的转化:两者都不能把
阅读全文
摘要:"bzoj" "luogu" sol 先考虑$d=0$怎么做吧。 每个位置上只有两种选法,相当于每个位置是一个布尔变量,选第一种方案布尔值为0,选第二种方案布尔值为1。 然后考虑一组限制条件$(i,h_i,j,h_j)$,设$u$表示$[$在$i$位置上选$h_i]$,$v$表示$[$在$j$位置上
阅读全文
摘要:"bzoj" sol 把一条边拆成两个点。 考虑这样一个东西:$\max(a,b)=a+\max(b a,0)$ 那么我们在每次进入一个点之前把他的入边的权值即$a$加上,在这个点的内部把$\max(b a,0)$加上。 如果$b a$那么就需要加上额外代价,如果$b\le a$额外代价就是零。 把
阅读全文
摘要:"bzoj" sol 显然你要知道每个位置下球的情况就要知道每个$sum_i sum_{i 1}$吧。 其实一个询问$i,j$就是告诉你$sum_j sum_{i 1}$的奇偶性,那么此时$sum_j$和$sum_{i 1}$这两个变量就相互关联了吧。 那么实际上就是要你使用最小的代价,把$sum_
阅读全文
摘要:"bzoj" sol 按照$x$或$y$排序,考虑两个相邻的点之间的距离,显然分步走不会比直接走更劣。 所以按照$x$或$y$排序后,只对相邻的先连边。 $Dijkstra$即可。 code cpp include include include include define ll long lon
阅读全文
摘要:"bzoj" sol 很显然设$f_{i,j}$表示在$i$号点已经使用了$j$次免费的最小费用。 转移就是两种,使用免费或者是不使用。 相当于就是$nk$个点的最短路。 $Dijkstra$即可。 code cpp include include include include define pi
阅读全文
摘要:"bzoj" "luogu" 题目描述 阿米巴是小强的好朋友。 在小强眼中,阿米巴是一个作文成绩很高的文艺青年。为了获取考试作文的真谛,小强向阿米巴求教。阿米巴给小强展示了几篇作文,小强觉得这些文章怎么看怎么觉得熟悉,仿佛是某些范文拼拼凑凑而成的。小强不禁向阿米巴投去了疑惑的眼光,却发现阿米巴露出了
阅读全文
摘要:"bzoj" "luogu" 题意 有一棵树,每个节点上有一个字符,一条路径上的字符连起来就是一个字符串。求树上一共有多少个不同的字符串。 $n\le10^5$,字符集大小$c\le10$,只与一个空地相邻的空地数量不超过20个。 sol 最后一句话是这道题的关键。 什么叫做“只与一个空地相邻的空地
阅读全文
摘要:"bzoj" 题意 给出$n$个串,求每个串中有多少个子串在至少$k$个串中出现过。 sol 广义后缀自动机。 先建好广义SAM,也就是把这$n$个串全都插到SAM里面去,那么可以维护每个状态在哪些串里面出现过。 可以给每个状态维护一个$set$,然后向上合并就是直接并起来。 这里我写基数排序结果鬼
阅读全文
摘要:"bzoj" "luogu" 题意 求一个串的第k小子串,不同位置上的相同内容的子串有时会视作同一子串,有时视作不同子串。 sol 基数排序处理$size$。 “不同位置上的相同内容的子串是否视为相同”决定了一个状态对答案的贡献到底是$endpos$集合大小还是$1$。 除此之外就是第$k$小的查询
阅读全文
摘要:"luogu" 题意 给一个串,求其第k小子串。 不同位置出现的内容相同的子串算作同一个子串。 有多组询问。 $n\le9 10^4,T\le500$ sol 建出SAM后跑一遍基数排序,预处理出每个状态可以转移到的子串个数。 然后就变成了一个比较经典的第$k$小问题:假设当前面临状态$now$,若
阅读全文
摘要:"vjudge" 题意 求多个串的最长公共子串 sol 首先拿第一个串建SAM。 然后对于每一个串,在SAM上跑匹配。 那么最终就是要把多个串跑出匹配的信息合并起来。 具体来说,对每个串记录一下在每个状态上的最长长度,然后同一个状态上对每个串的最长长度取个$min$,最后再把每个状态取个$max$。
阅读全文
摘要:"vjudge" 题意 求两个串的最长公共子串 sol 一个串建SAM,另一个串在SAM上跑匹配。 每次维护一下当前的最长长度就可以了。 code cpp include include include using namespace std; const int N = 5e5+5; int n,
阅读全文
摘要:"bzoj" "luogu" 题意 求一个串每个前缀中含有多少个不同字串 $n\le100000$,字符集大小$10^9$ sol 后缀自动机的转移开个$map$就好了。 每次插入以后,新增的贡献就是$len[last] len[fa[last]]$。 累加即可。 code cpp include
阅读全文
摘要:"vjudge" 题意 求长度为$i$的子串在原串中出现次数的最大值。 sol 还是直接求$endpos$集合大小。 最后做一遍后缀最大值,因为很明显答案单调不增。 code cpp include include include using namespace std; const int N =
阅读全文
摘要:"luogu" 题目描述 给定一个只包含小写字母的字符串$S$ , 请你求出$S$的所有出现次数不为$1$的子串的出现次数乘上该子串长度的最大值。 sol “出现次数大于$1$”也就是$endpos$集合大小大于$1$。 所以可以直接上基数排序求每个状态的$endpos$集合大小。 (我可能比较无聊
阅读全文
摘要:"vjudge" 题意 给你一个串,求不同字串个数。 $n\le10^5$ sol 直接建SAM然后输出$\sum_{i=1}^{tot}len[i] len[fa[i]]$ code cpp include include include using namespace std; const in
阅读全文
摘要:后缀自动机总结 ~~鉴于我觉得也没有人会看我这份总结学SAM,所以这里索性就只放一个板子了。~~ 核心代码在这里: 几个需要注意的地方: 1、$N$的大小要开两倍。 2、$last,tot$的初值是$1$。 3、在字符集比较大的时候$tr$转移可以开$map$,空间复杂度更优秀尽管加那么一点点常数。
阅读全文
摘要:"vjudge" sol 树DP。 首先把模型转换成:每个点可以控制与它距离不超过$w_i$的点,先要求选出数量最少的点控制所有点。 设$f[i][ 100...100]$表示$i$号点向上还可以额外控制距离为$j$的点的选点最少数量。 $j$为负则表示$j$子树中还有$ (j+1)$深度的点没有控
阅读全文
摘要:"bzoj" "luogu" sol 很显然的两遍树DP吧。 设$f_i$表示只考虑$i$的子树,$i$点没有电的概率。 $$f_i=q_i \prod_{v是i的儿子}f_v+(1 f_v) (1 p_e)$$ 为了方便表示把后面那一坨记为$h_v$,即$h_i=f_i+(1 f_i) (1 p_
阅读全文
摘要:"bzoj" "luogu" sol 首先考虑如果没有硬币数量的限制该怎么做。 直接上背包吧。 直接上背包存在的问题就是不知道硬币的使用数量有没有超出限制。 那就容斥一波。 考虑每种硬币,强制其超出限制,也就是强制先使用$d_i+1$个该种硬币,然后剩下队随便选。 时间复杂度是$O(V+q 2^4)
阅读全文
摘要:"bzoj" "luogu" sol 根据Nim游戏的原理可知若异或和为零则后手必胜,否则先手必胜。 所以题目的要求其实就是:选出一个总和尽量小的集合,使其补集的任意非空子集队异或和都不为零。 转化一下,去掉一个总和尽量小的集合,也就是保留尽量大。 这也就是 "bzoj2460元素" 那个题了。 而
阅读全文
摘要:[bzoj][1] [luogu][2] 题意:给你一段01序列,要求支持如下操作:(下面把正常脑区域视为0,脑洞视为1) 1、把一段区间全部改成1. 2、把一段区间全部的0挖出来(然后这个区间也就全部变成了1),把这些0放到另一个区间上的1位置,原本的0位置不需要再放,如果0不够就优先放前面。 3
阅读全文
摘要:"bzoj" Description 在Bytemountains有$N$座山峰,每座山峰有他的高度$h_i$。有些山峰之间有双向道路相连,共$M$条路径,每条路径有一个困难值,这个值越大表示越难走,现在有$Q$组询问,每组询问询问从点$v$开始只经过困难值小于等于$x$的路径所能到达的山峰中第$k
阅读全文
摘要:[bzoj][1] [luogu][2] sol 最小割树 请转[一道很相似~~完全一模一样~~的题][3] 所以跑出所有点对之间的最小割然后暴力统计答案即可。 code cpp include include include include using namespace std; int gi(
阅读全文
摘要:[bzoj][1] [luogu][2] sol 每对点对之间跑一遍最小割?naive了吧。 我们考虑任选两个点做一个最小割,那么这个最小割就会把原图分成两个点集。设这个最小割的权值为$val$,那么分处于两个点集的点对之间的最小割一定 不大于 $val$。 然后对于两个点集分别递归处理,每次在当前
阅读全文
摘要:[bzoj][1] [luogu][2] sol 假设不要求字典序最小,只求代价之和最小,那应该还是很好求的吧。 先对原序列求出一个$LIS$的$dp$数组,然后每个位置拆成两个点,所有$X_i$向$Y_i$连$B_i$的边,然后$S$向$X_i(dp_i=1)$,$Y_i(dp_i=LIS)$向$
阅读全文
摘要:[bzoj][1] [luogu][2] sol 因为交换两个同色的棋子是没有意义的,所以可以视作只有黑色的棋子在棋盘上,每次向相邻的格子移动一步,求最小移动次数。 把每个格子拆成三个点:原点,出点,入点。 考虑一个格子,有且仅有四种情况:初始没有棋子目标也没有棋子,初始没有棋子目标有棋子,初始有棋
阅读全文
摘要:"bzoj" "luogu" sol 很显然的建边方式:普通的桥建双向流量$inf$的边,危桥建双向流量$2$的边。 然后分别从$a_1$,$b_1$向$a_2$,$b_2$跑最大流,保证流量分别要大于等于$a_n$,$b_n$。 多源汇且源汇一一对应的网络流是一类NPC问题,但在这里只有两源两汇,
阅读全文
摘要:[bzoj][1] [luogu][2] sol 这不是线性基思博题吗 我写的是树链剖分+st表,复杂度是$O(n\log^3n+Q\log^3n)$的,理论上过不了。 所以需要卡一下常。比如说线性基的$\rm merge$里面的那个if code cpp include include using
阅读全文
摘要:[bzoj][1] [luogu][2] sol 首先很显然的,答案等于1到n的任意一条路径的异或和与若干个环的异或和的异或和。 因为图是联通的,那么就可以从一个点走到任意一个想要走到的环上,走完这个环后原路返回,那么中间的路径刚好抵消,所以这样是成立的。 现在需要把所有环的异或和丢到一个线性基里面
阅读全文
摘要:[bzoj][1] sol 按照魔力值排序,然后从大到小能放则放。 这个贪心是很显然的,因为如果几个数放在一起不合法,那么去掉这些数中的任意一个都可以使之合法。所以肯定去掉最小的那个。也就是从大到小能加入则加入。 加入时用线性基算一下异或最小值,为0就说明不能加入。 code cpp include
阅读全文
摘要:[模板]线性基 [luogu][1] 给定n个整数(数字可能重复),求在这些数中选取任意个,使得他们的异或和最大。 $1\le n \le 50,0\le S_i \le 2^{50}$ 线性基 线性基其实就是构造出一组序列$p_0,p_1...p_n$,使得从这些数中任选一个子集的异或和的值域同等
阅读全文
摘要:[bzoj][1] [luogu][2] sol 观察系数$k$可以发现一个很有趣的规律:系数恰好可以视作对相对数量较少的用户个数。(若两者数量相等则视作$B$少) 比如说,表格的第二行,当$i$的付费方式为$A$,$j$的付费方式为$B$,且$n_A include include using n
阅读全文
摘要:[bzoj][1] [luogu][2] sol 某一枚导弹被拦截的概率等于这一枚导弹被拦截的方案数,也就是这枚导弹参与构成最长不上升子序列的方案数,除以最长不上升子序列的总方案数。总方案数会爆long long,但是可以用double存(雾) 从前往后做一遍最长不上升子序列,再从后往前做一遍最长不
阅读全文
摘要:[bzoj][1] [luogu][2] sol cls的题目,写起来挺容易但思维的确是挺神的。 求中位数可以先二分中位数,然后把所有大于等于这个数的全部设为1,把所有小于这个数队全部设为 1,然后查一下区间总和是否大于等于0即可判断是否合法。 但是显然不能对于每次询问这么搞一下,所以事先建立n棵主
阅读全文
摘要:[bzoj][1] [luogu][2] sol 树状数组套线段数题解。 对每个位置记一个$last_i$,表示与这个位置颜色相同的前一个位置。若这个位置上的颜色是第一次出现则$last_i=0$。 那么查询的时候就查询所有$L\le i\le R$中$last_i include include
阅读全文
摘要:[cjoj][1] sol 子树转化成dfs序上的区间。 所以就变成了:区间Kth,区间内[a,b]范围内的数有多少个,单点修改 裸的树套树啊。 code cpp include include using namespace std; int gi() { int x=0,w=1;char ch=
阅读全文
摘要:[vjudge][1] sol 字典序最小可以通过倒着$dp$解决。对每个$i$记录它可以转移到的$dp$值最大且字典序最小的$nxt_i$。 尝试着写一下$dp$式子。 $$dp_i=max\{dp_j\}+1(j i,L_j\le L_i,R_j\ge R_i)$$ 同时要保证$j$最小。 对$
阅读全文
摘要:[bzoj][1] [luogu][2] sol 每次至多只有一个位置发生变化啊 考虑设第$i$个数是$a_i$,其可以被修改成的值最小是$L_i$,最大是$R_i$。初始默认$L_i=R_i=a_i$。 考虑如果有两个位置$i,j$要相邻(假设$j$在$i$的前面),那就必须满足$a_j\le L
阅读全文
摘要:树套树乱讲的代码 由于部分代码的完成时间较早所以码风可能有些差异,敬请谅解。 动态区间Kth [题面][1] [整体二分题解][2] [HNOI2016]网络 [题面][9] cpp include include include using namespace std; const int MAX
阅读全文
摘要:树套树乱讲 树状数组套线段树 先学会主席树。 主席树可以被理解为一个二维平面,其中n棵树可以视作横轴,每棵树中的坐标范围(也就是线段树的坐标范围)可以视作纵轴。这样一来就是用主席树维护了一些在二维平面上的点,给定$a,b,c,d$,可以在$O(\log{n})$的时间内求出满足$a\le x_i\l
阅读全文
摘要:[luogu][1] sol 一周没摸键盘了回来刷刷水题练练手感 显然,最大化收益可以转化为最小化损失,从而建立最小割模型。 记$tot=\sum_{i=1}^{m}C_i$,事先假设所有的获益都得到了,那么“某一个获益没有得到”和“建立了某一个通信中转站”都被视作是损失。 建图: 源点向所有中转站
阅读全文

浙公网安备 33010602011771号