02 2019 档案
摘要:"题目" 这题的数据有点水,暴力合并$set$好像过了 分析一下这个题的性质,发现我们一条非树边就会形成一个环,而我们要求选择两个非树边,就会形成两个环,要求不走重复的点,就是说我们需要走一个大环,且必须经过这两个小环 显然需要这两个小环有至少一条公共边 发现问题转化成了求 有多少对路径,这对路径有
阅读全文
摘要:"题目" 好题啊 先把两种贡献翻译成人话 对于$(i,j)$,如果$a_i,a_j$恰好是$[i,j]$之间的最大值和次大值,那么$(i,j)$产生$p1$的贡献 否则对于$(i,j)$,$a_i$是最大值或者$a_j$是最大值,那么就产生$p2$的贡献 哎这个一个最大值一个严格次大值好像有点眼熟啊
阅读全文
摘要:"题目" 哈哈哈哈哈哈哈哈哈哈我还没自闭 好像前后调了两天了 哈哈哈哈哈哈哈哈哈哈我还没自闭 这道题就是给定一个小写字母串,回答分别把每个位置上的字符替换为$ $后的本质不同的子串数 首先就是跨过这个特殊字符的字符串出现次数显然都是$1$,这部分的贡献就直接是$i\times(n i+1)$ 之后我
阅读全文
摘要:"题目" 来学$2$ $sat$了 这个东西确实不难 这个算法就是给你一堆$bool$变量$x_1,x_2...x_n$,之后给你一些限制 限制的形式就是给你一对$(u,o1,v,o2)$ 让$x_u=o1$或者$x_v=o2$ 之后满足所有限制 这个东西非常容易就能抽象成一个图论模型 我们把每个$
阅读全文
摘要:"题目" 人傻常数大,bz显然是会$T$的 但我就是来复习一下$lct$的板子的 发现就是让你最小化两点之间的最大路径,于是自然地想到了最小生成树 发现删除操作好像不能在最小生成树上搞,于是我们离线下来倒序处理 先用从头到尾都没有被删除的边做成一棵$MST$ 每加进来一条边,如果这两点不连通,那就直
阅读全文
摘要:"题目" 抄$yyb$的题解真爽啊 根据一个非常显然的性质两个 前缀的最长公共后缀 的长度是后缀树上两个节点对应的$lca$的$len$ 每次询问是一个区间,好像不是非常可做啊 于是我们可以先离线,利用$set$在$parent$上启发式合并,显然两个节点只需要在$lca$处统计贡献 当我们启发式合
阅读全文
摘要:"题目" 人生第二道可怜题,依旧来自于$JXOI$ 首先发现这个东西长得和分手是祝愿差不多,于是考虑一下贪心 显然贪心的策略应该是从小到大一个一个试,遇到一个不能表示成前面的数的倍数的数就把这个数选上 先用类似埃筛的东西求出这样的数的个数$m$ 如果$t(p)=i$,那么这$m$个都必须在$i$步之
阅读全文
摘要:"题目" 这真是一道神仙的一批的题目 定义$s(i,j)$表示从点$i$到点$j$经过的颜色数量 设 $$sum_i=\sum_{j=1}^ns(i,j)$$ 求出所有的$sum_i$ 考虑点分治 对于一个点我们用两种方式来统计其答案 1. 这个点作为分治重心时,分值区域内所有点到这个点贡献 1.
阅读全文
摘要:"题目" 求出$mod\ 3=0$的路径条数,乘$2$加$n$除以$n^2$就是答案 点分治就好了 代码 cpp include include include include define maxn 20005 define re register define inf 99999999 defi
阅读全文
摘要:题目 首先看到要让一个平均值最大,想到 \(0/1\) 分数规划 二分一个 \(mid\) 作为答案 如果存在 \(\displaystyle \frac{\sum_{e\in S}v(e)}{\sum_{i=1}^{|S|}1}>mid\) 那么 \(\displaystyle \sum_{e\i
阅读全文
摘要:"题目" 我终于来抄点分治的板子了 随便说一点理解吧,点分治就是一种能求某种特定树上路径数量的算法 就是选择一个分治重心,统计一下以这个重心为$LCA$的路径的信息 之后对这个重心的子树再次分别选择分治重心,递归下去完成统计 这道题还用了一下容斥的思想 代码 cpp include include
阅读全文
摘要:"题目" 我还没疯 发现如果我们将血量抽象成点,一轮操作抽象成图上的一条边,我们如果能求出每一条边的概率,我们就能搞一下这道题 假设我们求出了这个图$E$,设$dp_i$表示从$i$点到达$0$点的期望路径长度 那么我们可以列出如下的方程 $$dp_u=\sum_{(u,v)\in E}P(u,v)
阅读全文
摘要:"题目" 杜教筛板子了 cpp include include include include include define re register define maxn 5000005 define LL long long using namespace std::tr1; unordered
阅读全文
摘要:"题目" 发现无论是什么时候,毕姥爷的概率题我就是不会做 首先先看到一个显然的性质,就是一个开关最多被操作一次,于是整个序列最多也就被操作$n$次 看到有$50$分$k=n$,于是只需要求一下最少几步关掉全部的灯即可 这里需要一个贪心,显然我们需要先去关编号大的灯,编号大的灯只会影响它的约数不会影响
阅读全文
摘要:"题目" 有趣的思想 首先暴力的话,自然是对每一个询问在$AC$自动机上跑一遍$k$,看看跑出来的节点在$fail$树到根的路径上有多少个$l$到$r$之间的结束标记就好了 我们发现无论怎么优化好像都不是很可行,考虑一下对根号优化 对于长度大于$\sqrt{n}$的串,显然这样的串也不会超过$\sq
阅读全文
摘要:"题目" 先来画一画柿子 设$dp_i$表示你第$i$天之后最多剩下多少钱 考虑一下对于$i$的转移,我们肯定要在之前枚举一天$j$这一天把所有的东西买进来,之后在$i$天卖掉 设那天买进$A$的量为$d_a$,买进$B$的量为$d_b$ 我们可以得到这样的方程 $$d_ap_a+d_bp_b=dp
阅读全文
摘要:"权限题" 就是一个集合$hash$ 集合$hash$可以用于判断两个集合是否相等,具体做法就是给每个随机一个值,之后异或起来就是可以了 这个题就是这样,处理出每个点直接相连的点集的$hash$值,之后判断一下有多少对$hash$值相等就好了 在考虑一下每条边就做完了 代码 cpp include
阅读全文
摘要:"题目" 挺好的一道题 我们考虑把$i$作为选取的最大子段的结束位置,我们如何往前计算贡献呢 考虑一下这个乘上其在队列中的位置可以表示为这个数被算了多少次,而我们往前扩展一位当前已经被扩展的就会被计算一次 设$s_i$表示序列的前缀和 扩展一次 $$s_i s_{i 1}$$ 再扩展一次 $$s_i
阅读全文
摘要:"题目" 来写一个$3$个$log$的垃圾做法 其实非常显然就是倍增把这条路径处理一遍,之后维护出倍增数组的线性基,大力合并就好了 线性基合并就是把一个线性基的所有元素都拿出来,一个一个插入到另外一个中去 代码
阅读全文
摘要:"题目" 刚开始看成不能取走一整堆吓死我了 还有这出题人的语文水平,一回合不是两个玩家操作各一次吗? 考虑一下Nim游戏里面临的必败条件 $$\bigoplus \sum_{i=1}^nres_i=0$$ 也就是所有数的异或和为$0$ 从线性基的角度来考虑这个问题 我们可以把某一个部分$S$搞出来
阅读全文
摘要:"题目" 神仙题啊 发现题目里有一句非常重要的话“ 当一条边在路径中出现了多次时,其权值在计算 XOR 和时也要被计算相应多的次数 ” 这告诉我们走一条边两次显然没有什么贡献 所以计算贡献的应该是那些走了奇数次的边 我们发现我们可以把一个环上所有的边都走奇数次遍历一个环 而两个环之间如果有路径连接的
阅读全文
摘要:"题目" 线性基巧妙的一批 线性基的插入看起来很玄学,就随便说几句好了 上面那个$x$异或上$lb[j]$其实就是把这一位干掉,把我们要插入的这个数变成异或后的值,如果最后异或的结果是$0$,那么就说明这个数已经可以被线性基表示出来了 那么表示这个数的线性基中的几个元素也一定会可以表示一些其他的元素
阅读全文
摘要:"题目" 这题就是一个图上随机游走的板子了 设$dp_u$表示$u$点的期望经过次数,那么非常显然 $$dp_u=\sum_{(u,v)\in e}\frac{dp_v}{d_v}$$ 也就有 $$\sum_{(u,v)\in e}\frac{dp_v}{d_v} dp_u=0$$ 根据这个列出$n
阅读全文
摘要:"题目" 这题神仙的一批 看到乘法显然并不是很好做,尝试将其转化为加法 乘法变加法最常见的方式就是取$log$ $$\prod_{i=1}^na_i\equiv x(mod\ P)$$ 就变成了 $$\sum_{i=1}^n log(a_i)\equiv log(x)(mod\ P)$$ 但是在模意
阅读全文
摘要:"题目" 首先这道题的生成树部分还是比较好想的,如果只有$a$或$b$一个限制,那么我们求一个最小生成树最小化最大边权 有两个限制的话我们先对$a$求出最小生成树,考虑把没有加入最小生成树的边加进去,显然会使得$1$到$n$之间最大的$b$变小,就把剩下的边一条一条加进去,维护出$1$到$n$之间的
阅读全文
摘要:"题目" 有生之年我竟然能$A$ 这个题求的是这个 $$\sum_{i=1}^n\sum_{j=1}^nf(gcd(i,j))^k$$ $f(i)$定义为$i$的次大质因子,其中$f(p)=1,f(1)=0$ 看到这道题的第一反应肯定是这东西TM还能求 习惯性反演 $$\sum_{d=1}^nF(d
阅读全文
摘要:"题目" 考虑类似$hash$的方式 以$p$为模数$10$为进制,处理出一个前缀$hash$ 这样如果要判断一个子串$[l,r]$是否被$p$整除只需要看一下 $$ha_r ha_{l 1}\times 10^{r l+1}\equiv 0(mod\ p)$$ 是否满足就够了 画一画柿子满足 $$
阅读全文
摘要:"题目" 不是很能看懂题意,其实就是求$[l,r]$区间内所有数的次大质因子的和 这可真是看起来有点鬼畜啊 这显然不是一个积性函数啊,不要考虑什么特殊的函数了 我们考虑Min_25筛的过程 设$S(x,y)$表示$[1,x]$内的数满足$minp(i) =y$的数的次大质因子的和 还是分成质数合数以
阅读全文
摘要:"题目" 求 $$\sum_{i=1}^n \sigma(i^k)$$ 我们先来设一个函数$f(i)=\sigma(i^k)$ 根据约数个数定理 $$f(p)=\sigma(p^k)=k+1$$ $$f(p^c)=\sigma(p^{ck})=ck+1$$ 这不就可以Min_25筛了吗 还是先求出来
阅读全文
摘要:听说这个东西能给予人力量 那就来学一学吧 功能就是筛一个积性函数$f(i)$的前缀和 Min_25筛好像是最近才流行起来的筛法,复杂度是非常神奇的$O(\frac{n^{\frac{3}{4}}}{logn})$ 和杜教筛一样,使用这个筛法的也有一定要求, 就是$f(p^c)$需要在$O(1)$求出
阅读全文
摘要:"题目" 真是一道非常好的码农题,$SAM+LCT$ 看到查询子串出现次数我们就能想到这是一个$SAM$ 看到动态往后加入字符串我们就可以想到需要$LCT$来维护子树和 由于$LCT$并不是很方便维护子树,所以每次加入一个点的时候只需要把根到这个点的路径上的点权加一就好了 查询在$SAM$上匹配出位
阅读全文
摘要:挺麻烦的,就当存一下板子了 cpp include include include define maxn 1000005 define re register define LL long long int n; int f[maxn],p[maxn],s[maxn],d[maxn],num[ma
阅读全文
摘要:"题目" 这不是线段树模板2放$lct$上了吗 于是开始码码码 之后一直wawawa 于是开始调调调 之后旁边的慎老师看了一看代码就说,你下放乘法标记的时候不乘加法标记吗 我:。。。 代码 cpp include include include include define maxn 300005
阅读全文
摘要:"题目" 由于始终保证连通性于是我们可以用$LCT$来维护这个森林 三个操作分别是$link,cut,findroot$ 代码 cpp include include define maxn 10005 define re register inline int read() { char c=ge
阅读全文
摘要:"题目" 终于去写$LCT$了 "这个大爷讲的挺好的" 板子 cpp include include include include define maxn 300005 define re register define LL long long define max(a,b) ((a) (b)?
阅读全文
摘要:还有这么板子的题? 和你谷上后缀自动机的板子基本一样,区别就是之后这个位置是$0$才计入贡献 代码 cpp include include define maxn 400005 define re register define LL long long define max(a,b) ((a) (
阅读全文
摘要:厚颜无耻的发一篇可能是全网最劣解法 我们发现要求给定的串所有不同的循环同构出现的次数,可以直接暴力啊 因为一个长度为$n$的串,不同的循环同构次数显然是不会超过$n$的,所以我们可以直接对每一个循环通过分别求一下其出现次数 求其出现次数当然可以交给$SAM$来搞了 于是我们把所有的串都插入$SAM$
阅读全文
摘要:"题目" 直接线段树合并就好了 之后在线段树上二分贪心选取金额较少的 如果是左偏树的话就开一个大根堆,根和子树顺次合并,合并之后堆内所有元素总和如果大于$m$就删除堆顶,由于每个元素只会被删除一次,所以复杂度非常科学 代码 cpp include include include include de
阅读全文
摘要:"题目" 多了区间翻转,之后没了 区间翻转的标记记得在$kth$的时候下传 代码 cpp include include include include define maxn 2100005 define re register int n,m,root,len,pos=1; char val[m
阅读全文
摘要:"题目" 发现这样一句话就会导致$T$ 并不是很知道为什么,可能这是某种未定义行为在不同编译器下会有不同后果? 至于这道题就很简单了,几个有关光标位置的操作就用一个变量模拟就好了 插入的话把这个位置转出来构造一棵完美$splay$插入就好了 删除直接转出区间断开的父亲的链接 输出直接转出区间中序遍历
阅读全文
摘要:"题目" 发现是顺次插入的,于是很好做 设$dp_i$表示$i$结尾的$LIS$,每次插入一个数找到之前的最大的$dp_j$加一就好了 至于如何找到这个元素应该在的位置,可以考虑类似区间提取的方法 如何要在$x$位置后面插入一个元素的话我们就先将$x$转到根,$x+1$转成根的右儿子,$x+1$的位
阅读全文
摘要:"题目" 刚开始并没有看懂题意于是痛苦的挣扎了好久 题意是这样的 问$[l,r]$有多少对$(i,j)$满足$a_i$和$a_j$恰好是$a_i...a_j$中严格最大的两个数 强制在线 先考虑$a_j$是$a_i...a_j$严格第二大的那一个 我们可以一个单调栈扫过去找到$j$之前第一个大于等于
阅读全文
摘要:"题目" 发现需要一个$O(n\sum a_i )$的做法 于是可以直接做一个背包,$dp[i]$表示和为$i$的子集是否有奇数种 $bitset$优化一下就好了 cpp include include include include include define maxn define re re
阅读全文