脑子恢复训练
考个省选脑子就没有了
现在恢复一下..
[2018.5.7]
看了一早上斯坦纳树没看出个什么东西..
就是解决图某个点集的最小生成树的,复杂度大概是$O(n\times 3^k)$
算法大致流程:
记$f_{i,state}$表示经过点$i$,使$state$的特殊点联通的最优解
1)枚举两个集合合并
2)走到下一个点,这个可以用spfa优化
其中甚至有不合法的情况,但这样肯定比最优解要劣所以就不用管啦
2595: [Wc2008]游览计划
裸的斯坦纳树
Topcoder SRM470 1000 BuildingRoads
裸的斯坦纳树,还要枚举子集合并
HDU4085 Peach Blossom Spring
裸的斯坦纳树,还要枚举子集合并
[2018.5.8]
果然是什么脑子都没有了..
#104. 【APIO2014】Split the sequence
简单的斜率优化
#105. 【APIO2014】Beads and wires
如果确定了根可以比较容易推出dp方程
$f_{x,0/1}$表示$x$所在子树,且$x$是/不是蓝边的中点的答案
然后就可以反着dp下去了
*#107. 【APIO2013】ROBOTS
斯坦纳树dp
不知道为什么wa了..
[2018.5.9]
#110. 【APIO2015】Bali Sculptures
分两个case来讨论
从高位到低位一个一个考虑
Case1:
$f_{i,j}$表示前$i$个分$j$段是否可行
Case2:
$g_{i}$表示前$i$个最少分多少段
#111. 【APIO2015】Jakarta Skyscrapers
对于$p_i>\sqrt{n}$的暴力连边
对于$p_i\leq \sqrt{n}$的拆点连边
可以证明这样的复杂度是$O(n\sqrt{n})$的
[2018.5.16]
*724F. Uniformly Branched Trees
记录$f_{i,j,k}$表示大小为$i$的树,有$j$棵子树,每一棵子树大小都小于等于$k$的方案数
转移枚举大小为$k$的子树有多少棵就行了
然后就可以像统计烷烃那道题一样了
724G. Xor-matic Number of the Graph
sb题
*722E. Research Rover
记录$f_{i,j}$表示从$(1,1)$到第$i$个点经过不超过$j$个特殊点的方案数
这个就用总方案减去超过$j$个特殊点的方案即可
然后就很好算了
[2018.5.17]
722F. Cyclic Cipher
对于每一种颜色可以双指针搞,复杂度为$O(40n)$
713D. Animals and Puzzle
统计每个点为右下角的答案
二分答案然后就可以二维rmq了
*713E. Sonya Partymaker
原来椅子搬走了位置还在的..
二分答案
发现答案肯定不会超过间隙最大的长度,我们把它放在$1$和$n$的位置上
有个结论,$1$和$2$肯定有一个要往左
如果$1$和$2$都往右而$3$往左,那么把$1$往左会更优
记录$f_i$为选了前面$i$个最远到哪
那么分下列三种情况讨论:
1)$i$往右,前提是$f_{i-1}\geq a_i-1$
2)$i$往左,前提是$f_{i-1}\geq a_i-mid-1$
3)$i$往左且$i-1$往右,同时覆盖$[a_{i-1},a_i]$这一段,前提是$f_{i-2}\geq a_i-mid-1$
最后再验证一下最远到达是不是满足
[2018.6.13]
最近在做zjoi讲的题..
788D. Finding lines
询问(x,x)是一个很好的方法
先找出行列都没有的(t,t)
然后就从x=-1e8开始询问
每次x+=询问的答案
这样是相当于倍增
然后第一次x+=1000会变快
744D. Hongcow Draws a Circle
一开始想到那个v图的三角剖分
发现没法处理样例1的情况
枚举贴着的蓝点二分求半径
但是这样二分不满足单调不能二分
于是先枚举贴着的红点求最大半径,那么大于这个答案再二分就满足了
通过先随机排列红蓝点把需要二分的点数降到$O(logn)$个
很妙
618G. Combining Slimes
一个长度为$x$的空格最大能产生$x+1$
最后的序列一定是由若干个递减且结尾为$1$的序列组成的(最后一个结尾可能为$2$)
发现出现$50$的概率小于$10^{-300}$,所以就不管比$50$还要大的数了
记$a_{i,j}$表示长度为$i$的序列变成$\{j,0,0,\cdots,0\}$的概率
记$b_{i,j}$表示长度为$i$的序列变成$\{j,0,0,\cdots,0\}$,且第一个放的是$2$的概率
可得$a_{i,j}=a_{i,j-1}\times a_{i-1,j-1},b_{i,j}=b_{i,j-1}\times a_{i-1,j-1}$
由于我们不考虑大于$50$的数,所以当$i>50$时,$a_{i,j}=a_{i-1,j},b_{i,j}=b_{i-1,j}$
这样子我们就可以算出第$i$位为$j$的概率了 $a_{n-i+1,j}\times (1-a_{n-i,j})$
现在我们记$f_{i,j}$表示$[i,n]$的期望权值和且第$i$位恰好为$j$
则答案可以表示为$\sum_{i=1}^{50} a_{n,i}\times (1-a_{n-1,i})\times f_{1,i}$
那么$f_{i,j}$同样是可以求出来的
当$j=1$时,$f_{i,j}=\dfrac{\sum_{k=2}^{50}b_{n-i,k}\times (1-a_{n-i-1,k})\times f_{i+1,k}}{\sum_{k=2}^{50}b_{n-i,k}\times (1-a_{n-i-1,k})}$
当$j>1$时,$f_{i,j}=\dfrac{\sum_{k=1}^{j-1}a_{n-i,k}\times (1-a_{n-i-1,k})\times f_{i+1,k}}{\sum_{k=1}^{j-1}a_{n-i,k}\times (1-a_{n-i-1,k})}$
由于当$i>50$时$a_{i,j}$和$b_{i,j}$都是不变的,所以可以先暴力求出前$50$项然后就可以矩阵乘法了
复杂度是$O(50^3logn)$
794G. Replace All
先考虑没有'?'的怎么做
1)第一个字符串一种字符多一种字符少
记这两个数值为$x,y$
也就是$|s|:|t|=x:y$
那么可以表示$s=w^x,t=w^y$
那么$w$就可以为长度小于等于$p=\lfloor\dfrac{n}{max(x,y)}\rfloor$的任意一个字符串
这样的答案就是$2^{p+1}-2$
2)两种字符一样多,且不完全相同
如果$gcd(|s|,|t|)=g$,那么长度为$g$的任意一字符串都是可行的
不妨枚举$g$,再找$[1,\lfloor\frac{n}{g}\rfloor]$中互质的对数,这样的答案就是$2^g\times (2\varphi(\lfloor\frac{n}{g}\rfloor))$
3)两种字符一样多,且完全相同
那么$s,t$选什么都是可行的,这样的答案是$(2^{n+1}-2)(2^{n+1}-2)$
这时候我们发现我们只对两个字符串A的数量差值感兴趣
所以我们只需要枚举这个差值就可以统计答案了,同时这样的方案可以用组合数统计出来
744E. Hongcow Masters the Cyclic Shift
发现只要存在一个字符串可以被两种或以上的方案表示出来就是不合法的了
同时我们发现右端点向右移动左端点是不会向左的
那么意味着我们只需要判断$O(n)$个区间就可以了
对每一个后缀建一个点,将每一个后缀与别的整串匹配,若完全匹配,连向匹配剩下的那个点
刚好匹配完就新建一个点,它连向所有开头
这样$O(m)$个点$O(nm)$条边的有向图假如存在环就表示有不合法的情况
中间那个匹配要用到拓展kmp
所以总复杂度是$O(n^2m)$的
[2018.6.21]
好多天没写了..
704E. Iron Man
写了没过.. 应该是精度爆炸了但是不想改..
假如是一条链的话就相当于是x-t图上的线段相交
进行树剖之后不也一样嘛..
复杂度是$O(nlog^2n)$的
645G. Armistice Area Apportionment
如果$P,Q$在直线一侧就是$2a$了
如果不在一侧就要作$P$过直线的对称点$P'$,答案就是$|P'Q|$
那就以每个点为圆心,以这个点到$P$距离为半径作圆
两圆交点就是可行答案之一,然后就可以二分判断弧相交问题了
750H. New Year and Snowy Grid
原来是个最大流问题,转化成最短路问题
因为问题只是最短路与$2$的关系,用并查集缩障碍点
然后再看看有没有点距离起终点都为$1$的点即可
722E. Verifying Kingdom
考虑一个一个叶子加入
点分判断即可
因为找一个子树中的叶子是$O(n)$的,所以总复杂度是$O(n^2logn)$
725G. Messages on a Tree
首先按照$x$的深度+时间排序,每一个操作就有优先级了
然后每个点去维护什么时候解除等待
树剖
就是一个区间覆盖等差数列和询问后继的问题了
UOJ#219. 【NOI2016】优秀的拆分
枚举AA的长度$l$,在字符串中每隔$l$个打一个标记,那么AA肯定会穿过两个相邻标记
在这个标记前后分别找lcs,这个可以用后缀数组+RMQ实现
然后就是差分区间+1的事情了
UOJ#220. 【NOI2016】网格
这个答案只有$-1,0,1,2$四种情况
$-1$就是$n\times m-c=1$或者$n\times m-c=2$且相邻的情况
$0$就是有多个联通块
$1$就是有割点
$2$就是没有割点
以每个障碍点为中心把其$5\times 5$的所有点拿出来
然后离散化,再去找点双即可
UOJ#221. 【NOI2016】循环之美
出现循环是余数出现$x$
那也就是$xk^l=x(mod\ y)$
因为$(x,y)=1$
所以$k^l=1(mod\ y)$
也就是$(k,y)=1$
那现在就是求$\sum_{x=1}^n\sum_{y=1}^m [(x,y)=1,(y,k)=1]$
化出来是$\sum_{(d,k)=1}\mu(d)\lfloor\dfrac{n}{d}\rfloor\sum_{y=1,(y,k)=1}^{\lfloor m/d\rfloor}1$
分块
分别递推计算
就可以了