Processing math: 100%

[BZOJ 4025]二分图

只会做水题力……qwq(搞错大小写,自裁请

每条边存在的时间事一个区间,因此考虑线段树分治……首先当然要写一个可撤销并查集。

然后每个点维护他到父亲的边的边权膜2,合并啥的和食物链就很类似力……然后判定已联通两点间边数的奇偶性就直接把两个点到根的值加起来就行了,因为LCA到根的部分会算两遍,对答案无影响。

代码:

[LibreOJ 2472][九省联考2018]IIIDX

一直没有填的坑……今天乱写了写跑过了然后厚颜无耻凑一篇题解

还有样例过于草(出题人钦点淫梦运营

考虑从小到大枚举序列的每一位置p,然后我们发现每一位置的值的合法性事单调的(小的合法,大了就不合法),这样可以对每一个位置二分答案。

然后我们考虑二分完了答案x怎么判定。把值离散化一下然后用一个线段树来维护Ti(表示当前还没有被预定的大于等于i的数有多少个),然后判定答案就看到x的前缀区间是否都不小于p所在子树的大小。同时注意顺次枚举每个点的时候要去除他对他父亲的影响,然后每次一个点确定是什么值了也要修改对应的前缀区间。

代码:

[BZOJ 2654]tree

APIO的时候听了一下wqs二分,做了这题,然后现在才写题解……

wqs二分的思路大抵就是你要求必须选k个,那就二分每个操作的一个“额外代价”,然后进行没有限制的选择。然后最后选出来的个数事和你二分的代价正相关/反相关的。

这道题的话,就二分选择黑边的代价,然后跑一般的最小生成树(有相同边权时要选择黑边!)。当然我们会遇到一个问题,就是二分到x的时候选的比k多,到x+1的时候又比k少了。这道题的处理方法,事考虑代价为x时,其实存在选k个的最优解(如果说大于x那就没了),因此我们钦点代价为x跑一遍限制只能选k条黑边的最短路即可。

代码:

[BZOJ 1004][HNOI2008]Cards

肉肉肉肉,,,

碰置换群啥的不是第一次了……这个题就是给你一堆置换(不要忘记还有一个幺元啊),然后限制颜色数量,求本质不同解个数。那么考虑使用Burnside引理,接下来考虑怎么计算每个置换的不动点数量,这个要求每个循环的颜色一致(不就事Polya定理了吗),所以说可以用背包DP搞一搞。

代码:

[BZOJ 3640]JC的小苹果

逆矩阵文明,,,

很显然我们可以定义一个状态f[i][j]表示当前血量为i走到j的概率,然后肥肠爆歉这个东西没法DP(可能会有的点的伤害为0,这样可以凿出来环)。考虑高消,这个东西有个好处是不可能从血量低的到血量高的状态,所以可以从大到小枚举血量,这样各层事独立的,复杂度比直接高消降低了很少。可惜复杂度为O(sn3)(设血量为s),会T掉。

考虑转移的过程,转移时等价于解这样一个方程:

a11x1+a12x2++a1nxn=c1a21x1+a22x2++a2nxn=c2an1x1+an2x2++annxn=cn

其中的未知数x事我们要求的东西,c表示从高血量状态转移过来的概率(这个可以视作常数)。根据友矩阵那一套理论,这一系列方程等价于以下等式:

[a11a12a1na21a22a2nan1an2ann][x1x2xn]=[c1c2cn]

不妨将之简记为AB=C,其中我们只有B不知道,要求的也是B。我们除一下就可以得到B=A1C,然后我们还发现每一层的A都是一样的,所以每一层的A1也都是一样的,预处理即可。这样转移部分的复杂度就变成了O(sn2)(矩阵乘法在这里事方阵乘列向量)。

至于逆矩阵的求法,我们知道对矩阵做初等变化也就等价于乘上另一个矩阵。因此,我们将一个矩阵A用类似于高消的手段消为单位阵I,所做的初等变换也就等价于乘上A1。我们对一个单位阵I作用上一样的操作,也就等于给这个单位阵乘上了A1,这样我们就得到了A1

代码:

[LibreOJ 2383][HNOI2013]游走

本野蛮人竟然没做过高消期望DP,,,泪,流了下来,,,

根据期望线性性,答案就是所有边的期望被走的次数乘上边的编号的和。一条边期望经过的次数可以根据他两个端点期望经过的次数来算(但是n要特判一下),要求所有点期望走过的次数当然就可以列n个方程然后高消力。然后期望走的次数多的边编号应该小,反之亦然,所以求完每条边走的次数的期望之后就贪心一下就好力。

代码:

[SZKOpuł ben][AMPPZ2014]Petrol

aji波兰题!(迫真)

啊波兰题真好康(一转)

考虑怎么去除非加油站的影响……对于每两个加油站,取他们的最短路,然后建出来一个图,这个图的MST上的路径的走法就事最优走法。

但这样显然会凉……因为s肥肠巨大,会T。然后我们考虑多源最短路,并且给每个点标记到它最近的加油站(称为来源)。那么考虑两条加油站间的路径,上面一定有一条边满足边两个端点不一样(证明考虑……如果所有边两边端点的来源都一样,那么所有边的来源会同时事那两个加油站)。

然后一个小问题事,如果一个点有多个来源,只考虑一个会出事吗?这个事不会的。比如说有三个加油站abc,如果说三者到一个点的最短路都一样,那么我们考虑只取a。如果bc本来能连一条边,但现在因为这个连不了了,那他们还是能同时各和a连一条长度和原来的那条边长度一样的边,所以事实上没有什么笋丝。

代码:

[SZKOpuł sol][POI2009]Elephants

aji波兰题!(直球)

这个题显然就是对那个排列乘上一个置换,然后置换的每一个循环事独立的,于是分别考虑每一个循环。

然后每一个循环有一种显然的构造方法就是从一个点开始,逆着边不停的交换两个点。这样的话有一个点会对答案做s1次贡献(s为循环大小),其他点都会只做一次循环。显然那个点选权值最小的点事坠吼的。

还有一种构造就是把全局最小值和循环最小值换一下,然后用上面的手段构造,最后再把全局最小值和循环最小值换回来。

代码:

[LibreOJ 2182][SDOI2015]寻宝游戏

很多人说事动态虚树……其实也不算是吧,虽然这个东西用力虚树的思路惹。

第一个想到的思路……就事动态的维护虚树,然后虚树上所有边的长度乘二就事答案。然后我们考虑一点……虚树求的时候需要对DFS序(严格来说事欧拉序)排序,所以我们大致可以认为,虚树上做欧拉回路的本质就事按照DFS序扫描,换言之就事DFS一遍,然后进入和回溯事都把边记录到答案里,这个值也就事虚树上按DFS序排序之后两两相邻点的距离的和(首尾也要额外算一遍)。

然后这样一来,我们发现虚树上的非关键点就可以删掉了。因为非关键点也就是所有两两在DFS序中相邻的关键点的LCA,然后那两个关键点的距离也就等于他们到这个非关键点的距离的和。因此我们不需要维护非关键点,问题就简单了许多……

代码:

[UOJ 333][NOIP2017]宝藏

啊啊啊爽到力,,,

过去太池沼力,没有做出来惹。现在看了看可能比较简单罢……

定义状态di,S表示当前已经被覆盖的点集为S,然后当前的生成树已经考虑到了第i层,转移看起来很毒……

所以预处理一个点集到另一个点集只走一步边来扩展,最优解是多少,然后转移就方便力……

代码: