02 2019 档案
摘要:"传送门" 有上下界最小费用可行流,行列建边变形。 行列建边相信大家都做过,没做过的可以看一下这个题: "bzoj3698XWW的难题" ,对应的我写的题解 "题解" 这个题需要变形一下,不只是单纯的对行列进行连边,首先对于一个空格,我们知道它最多影响2个线索:1个横向的和1个纵向的 所以我们可以对
阅读全文
摘要:"传送门" 后缀排序裸题,SA上就是了 代码: c++ include include include include using namespace std; void read(int &x) { char ch; bool ok; for(ok=0,ch=getchar(); !isdigit
阅读全文
摘要:没脸扔传送门了 写个AC自动机的题目被爆搜卡住,最终我决定不写这个爆搜了,太恶心了 状态压缩dp! 直接设$f[i][j][S]为长度为i,当前为第j个节点,经过的密码状态为S$ 因为哪怕只有一个位置不确定都有两种位置可以填,一共就有26 2=52 42种情况 所以如果要输出方案,所有的密码串一定是
阅读全文
摘要:"传送门" AC自动机上跑dp,首先想到正难则反 所以我们考虑不可读的字符串 设$f[i][j]$为长度为$i$,当前处理到第$j$个节点时的不可读字符串数 转移就很显然了 提示:如果一个节点的fail指针指向的节点中有一个是可读字符串的结尾节点,那么这个节点也是不可用的 代码: c++ inclu
阅读全文
摘要:"传送门" 我也没想到map如此垃圾,bitset优秀啊 直接trie树上搜索就好了 代码: c++ include include include include include include using namespace std; void read(int &x) { char ch; b
阅读全文
摘要:"传送门" 想到一个点上这个题目就没了:如果可以找到,那么必然是trie树上不经过病毒节点的一个环 接下来定义“病毒节点”:病毒节点就是病毒代码的最后一个字符,但是直接这样写会错,显然存在一个病毒代码是另一个病毒代码的子串的情况,那么一个病毒代码中就可能存在多个这样的病毒节点,怎么寻找呢?这就是一个
阅读全文
摘要:"传送门" 看着就是裸的AC自动机是不是?会T一个点 然而。。。为什么放过暴力KMP和暴力find,理论复杂度$O(nm)$起步啊 AC自动机加一个树上差分就好啦,对于每个字符串的查询,实际上都是在fail树上每个点到根的路径上+1 fail树建出来就没了 代码: c++ include inclu
阅读全文
摘要:"传送门" ac自动机模板题,裸的多串匹配 代码: c++ include include include include include using namespace std; void read(int &x) { char ch; bool ok; for(ok=0,ch=getchar()
阅读全文
摘要:"传送门" ac自动机模板,可能我写的ac自动机是有点问题的,所以跑的有些慢 暴力跳fail统计 代码: c++ include include include include include using namespace std; void read(int &x) { char ch; boo
阅读全文
摘要:"传送门" 这个题首先考虑什么时候是NIE 显然是存在一段$[l,r]$的人的总数 $k (r l+1+d)$ 此时显然并不好维护,毕竟不等式两边都与长度有关,长度这个因素不能忽略 拆括号之后移下项:$\sum_{i=l}^{r}v_i k k d$ 现在可以忽略长度了,左边显然就是最大连续子段和,
阅读全文
摘要:"传送门" 权值线段树套区间线段树的裸题,加了离散化就好了 或者也可以整体二分 代码(树套树): c++ include include include include using namespace std; void read(int &x) { char ch; bool ok; for(ok
阅读全文
摘要:"传送门" 典型的三维偏序,cdq分治 由于相同的花之间也会产生贡献,考虑将相同的花合并来做 代码: c++ include include include include using namespace std; void read(int &x) { char ch; bool ok; for(
阅读全文
摘要:"传送门" 深入理解了一波后缀数组,这东西真的很妙诶,自己推感觉完全不现实,看来只能靠背代码了 这段时间就多敲敲,把板子记熟吧 代码: c++ include include include include using namespace std; void read(int &x) { char
阅读全文
摘要:"传送门" 状压dp,最短路 spfa似乎特别慢 代码:
阅读全文
摘要:"传送门" 极其简单的dp题 代码: c++ include include include using namespace std; void read(int &x) { char ch; bool ok; for(ok=0,ch=getchar(); !isdigit(ch); ch=getc
阅读全文
摘要:传送门 自己的计算几何还是挺渣的呢。 其实只要考虑一下叉积的式子就可以想到前缀和了,但是显然需要按照极角序来做才能去掉绝对值 代码: #include<cstdio> #include<iostream> #include<algorithm> using namespace std; void r
阅读全文
摘要:"传送门" 自己想的方向一直是对的,但是一直没有完全正确 我一直没发现可以缩掉一维 原本列出的dp方程是这样的 $f[i]=f[j]+1(j include include include using namespace std; void read(int &x) { char ch; bool
阅读全文
摘要:"传送门" 考虑根节点的移动,移动到相邻节点对深度和的影响是很显然的 假设从$u$移动到$v$ 显然有$f[v]=f[u]+n 2 size[v]$ 先定下一个根节点$x$,求出$f[x]$,然后在dfs一遍进行换根转移就行了 dfs过程中更新答案 代码: c++ include include u
阅读全文
摘要:"传送门" 看到数据范围这么小,不由得算了一下暴力复杂度,算出来情况一共只有1e7,不多,再乘上暴力判断的复杂度,好像T了,判断的话位运算可以方便解决 但是我写的优化似乎比较渣,还留了个log,但是还是n那么小,log可以忽略不计了吧 代码: c++ include include include
阅读全文
摘要:"传送门" 这个题好难卡啊。 看到这种题自然会想到字符串hash是不是,但是对于每次操作造成的影响需要$O(n)$的时间去更新,自然是不优的 可以发现这个更新可以用数据结构来维护,对于每个hash值开一颗线段树之类的支持区间修改的数据结构 然后就可以愉快的解决了 注意: 1、hash值请使用map和
阅读全文
摘要:"传送门" 可以知道一共最多只有3种情况:基环树,环,自环 先考虑最少杀死: 首先发现入度为0的点一定能活下来,那么入度为0的点指向的人一定会死,他指向的人指向的人如果入度为0就一定能活下来(其实是不一定的,但是要保证死的人最少) 这样就可以拓扑排序写一下了,剩下的就是环的情况了,能活下来的显然是$
阅读全文
摘要:"传送门" 提示:被删掉的点也要算点对,$(i,j)$和$(j,i)$是不同的点对 显然找出割点就行了,记下size,对于各子树统计一下答案 代码: c++ include include include using namespace std; void read(int &x) { char c
阅读全文
摘要:"传送门" 异常激动,跑了bzoj的rank2 这个题一共有两个要求,先考虑第二个要求,可以知道每一次修改都会导致答案账户余额+2/ 2 所以修改方案是唯一的,可以$O(1)$算出来 然后考虑第一个要求,显然有结论:如果当前值为负,你可以修改当前位置之前的一个负号为正号,并且修改当前位置之后的一个正
阅读全文
摘要:"传送门" 读入输出题,看样例解释得出结论,具体原因不详 代码:
阅读全文
摘要:"传送门" 很容易发现和置换有关系,然后就可以推出在一个置换内,用代价最小的那个去做就行了 但是这不一定是最优的(我一开始也只考虑了这个,悲催的wa了) 看了篇题解发现还有一种情况没考虑 就是你可以选择用全局代价最小的交换到一个置换内,可以知道交换置换内代价最小的是最优的,然后做完再交换出来就行了
阅读全文
摘要:"传送门" 很显然的结论题啊,只要图中有环就一定可行,但是题目不保证联通,所以可能有多个联通块,需要分别判,dfs和并查集都行 洛谷要求输出方案,这个就把环找出来弄一弄就好了 代码(无输出方案):
阅读全文
摘要:"传送门" 阶梯nim模型 代码:
阅读全文
摘要:"传送门" sb单调栈,唯一要注意的是高度相同的时候不需要更新答案 代码: c++ include include include using namespace std; void read(int &x) { char ch; bool ok; for(ok=0,ch=getchar(); !i
阅读全文
摘要:"传送门" 很显然看的出是中位数吧,那只要动态维护一下中位数和区间和就差不多了吧 平衡树太难写,我选择权值线段树 洛谷的这个题要输出方案,但是不打紧 代码(bzoj): c++ include include include using namespace std; void read(int &x
阅读全文
摘要:"传送门" 有个非常显然的技巧,就是你可以反向建图,并且将图上下翻转,如果$i$能到其他所有道路,其他所有的道路也能到$i$ 这有什么好处呢,这就可以使$i$可以非常方便的转移到$i+1$ 我们设$f[i]$为$i$左边至少要建的公路数,然而$f[i]=i 1 lis$ 所以只要求lis就行了,树状
阅读全文
摘要:"传送门" 很显然的结论,$(x,y)$与$(y,x)$关于$y=x$对称 那么就可以知道所有点一定是在直线的一侧(暂时不考虑移动石子的代价),这样得出来的就是最小的篱笆长度 有一些点可以不需要动,那么第二问分四种情况讨论即可 代码: c++ include include include incl
阅读全文
摘要:"传送门" 很显然有一个结论:最大不过1,最小不过 1 然后dp,设$f[i][j]$为满足前$i$个不下降,当前放的是$j 2$,转移就比较好想了 具体方程看代码吧,终于有一个自己会写的题了 代码(写了好多没用的min): c++ include include include include u
阅读全文
摘要:"传送门" 这个题比较水,很容易看出 1、最短路小于d,直接看奇偶性就好了 2,最短路大于d,puts("NIE\n"); 主要就是判奇偶性的问题,将每个点拆成奇点和偶点跑bfs就行了 在线需要开short,不然空间会炸,离线就没有这个忧虑 代码: c++ include include inclu
阅读全文
摘要:"传送门" 这道题要将图形转化为字符串,可以发现,只要角相同,边长相同就存在一条对称轴,所以只要转换成字符串S,倍长为SS,拿反串匹配一下就好了。 代码: c++ include include include include using namespace std; void read(int &
阅读全文
摘要:"传送门" 线段树套线段树会TLE+MLE! 树状数组不仅空间小,常数也小(我写的除外) 思考一下求逆序对需要的条件,树套树就过了 代码: c++ include include include include using namespace std; void read(int &x) { cha
阅读全文
摘要:"传送门" 虚树裸题,建完虚树上tree dp就好了 代码:
阅读全文
摘要:"传送门" 这是我第二次看见这个题目了,第一次看见是另一场比赛的A题,想了一个小时不会写就弃了 从来没想过这个题能这么玩 线段树上记录根到叶子节点的距离 初始线段树上先记下根节点1到各叶子节点的距离 先离线,然后dfs整颗树,在dfs过程中考虑根的移动对线段树的影响 如果当前点是查询点,在当前线段树
阅读全文
摘要:"传送门" 我一开始以为每个位置只有可能是2个值,然后就GG了 然后摸了一眼题解,这tm怎么这个简单 仔细观察它的式子$c_i=c_{i 1}+c_{i+1} c_i$ 和差分有点像,看看差分数组$d_i=c_i c_{i 1}$ 容易发现每一次操作都是将$d_i$与$d_{i+1}$交换了 那么只
阅读全文
摘要:"传送门" 我觉得这个题特别水啊,就是自己不会写而已 只要想到每三个连续的可以转化,这题就差不多了 所以每种连续的最多出现2次,直接dp就行了 代码:
阅读全文