随笔分类 - bzoj
摘要:"传送门1449" "传送门2895" 平方很难处理,考虑剩下的比赛所有队全输(只能全输,全赢保证不了费用流的正确性),考虑计算每个队多赢一次的贡献 拆开: $c_i (x+1)^2+d_i (y 1)^2 c_i x^2 d_i y^2$ $=2 c_i x+c_i 2 d_i y+d_i$ 然后
阅读全文
摘要:"传送门" 和学长刚,说自己能不写返回值为struct的query并且不写单点查询而AC此题,挣扎了半个小时还是改回去了 直接树链剖分,对于每个节点记一下最左边的和最右边的颜色以及区间内的颜色段数,区间合并一下就好了 对于查询的时候,也合并一下,跳链的时候注意看一下两条链相邻的颜色,判断一下 这个题
阅读全文
摘要:"传送门" 这个题目和 "我的另一篇博客" 做法很像 做完那个几乎就会这个了吧 如果你不会,你可以继续往下看 实际上由于当前的数的sa不一定连续 所以需要求出任意两个的最长公共前缀 假设$x,y,y x$,就是$min\{height[x+1],...,height[y]\}$ 然后把原本的断开,把
阅读全文
摘要:"传送门" $log$多似乎不是什么问题,最容易想到的就是4个$log$的树剖+树套树吧 衷心希望大家别写线段树套线段树,这个东西真的极容易MLE(这题不会)以及TLE(这题在洛谷会TLE1个点,bzoj可以AC) 这题本质就是树上路径动态求第k大经过的点值,处理路径问题用树链剖分就好了,动态第k大
阅读全文
摘要:"传送门" 有上下界最小费用可行流,行列建边变形。 行列建边相信大家都做过,没做过的可以看一下这个题: "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
阅读全文
摘要:"传送门" 这个题首先考虑什么时候是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(
阅读全文
摘要:"传送门" 状压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
阅读全文