「THUPC 2019」题解

loj 6613 组合数据结构问题

模拟即可,不过有不合法操作要特判

code


loj 6614 过河卒二

首先一个点走到另一个点的方案可以\(O(\min(\Delta x,\Delta y))\)枚举几步斜的利用\(Lucas\)计算

一个想法是利用容斥,暴力枚举\(2^k\)种情况计算
预处理两两之间距离可以做到\(O(k^2m+2^kk)\)

code

实际上自己傻逼了
直接\(dp\)走到每个点且不经过另外点的方案
容斥减去其他点过来的方案即可
复杂度\(O(k^2m)\)

code


loj 6615 鸽鸽的分割

考虑加第\(n\)个点,首先和其他\(n-1\)会都切开一个,然后其他组成的所有三角形,和中间那个点都可以切开一个
\(f_n=f_{n-1}+n-1+{n-1\choose 3}\),整理得\(1+{n\choose 2}+{n\choose 4}\)

code


loj 6617 摆家具

here


loj 6620 不等式

强制\(a_i\)为正再拆一下变成\(\min \sum_i a_i|(x-\frac{-b_i}{a_i})|\)
那么可以看做在数轴上的\(\frac{-b_i}{a_i}\)\(a_i\)个点,需要找到一个点到其他所有点距离之和相等
那么显然就是中位数的位置,于是线段树维护,在线段树上二分,然后对于左右分别询问一下即可
复杂度\(O(nlogn)\)

code


loj 6622 找数

考虑计算每种权值的生成树数量
考虑\(matrix-tree\)只能求边权乘的情况
而位运算\(fwt\)之后就是点积相乘,且每一位相互独立
于是将每一条边\(fwt\)后提出对应位做矩阵树
然后\(ifwt\)回去
而且\(fwt\)支持对每一位做不同的运算

code


loj 6623 大碗宽面

考虑对于\(s,t\)两个碗,先假设\(|s|,|t|\)都为偶数,如果\(s\)\(j\)作为中位数,且\(t\)中第一个小于等于\(j\)的为\(k\)
那么有\(j+k=\frac{|s|+|t|}{2}\)
也就是\((2j-|s|)=(|t|-2k)\)
先把所有面提出来排序,从小到大枚举每一个作为答案的贡献
这时已经知道了\(2j-|s|\),直接对于所有目前权值为\(|t|-2k\)\(t\)计算贡献
对每个权值维护一个链表即可,由于总对数为\(O(n^2)\),所以复杂度一定是对的

复杂度\(O(n^2+nmlog)\),如果写基排可以优化掉那个\(log\)

code



猜你喜欢

转载自www.cnblogs.com/KamiyamaShiki/p/12811393.html