「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 6618 令人难以忘记的题目名称

首先考虑什么会必胜
从后往前考虑
直接胜的就是全\(0\)序列
一步赢的对于任意\(i,j,s_i+t_j\equiv 0\)
\(s\)要全相等
类似两步即差分后全相等
另外有如果差分\(p^k\)次后,\(s'_i=s_i-s_{i+p^k}\)
证明可以把差分后形式写出来后发现多余的数的组合系数\(\%p\equiv =0\)

找到一个\(k\)满足,差分\(p^k\)次后为\(0\),那么即\(s_i=s_{i+p^k}=s_{i+gcd(p^k,n)}\)
于是只用考虑\(n\)中最大的\(p^k\)即可

先判是否合法
然后看\(p^{k-1}\)是否合法,不行就差分\(p^{k-1}\)次,直到可以
复杂度是等比数列求得\(O(np)\)

code


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 6021 改善生活

可以发现显然最多选一个,选多一定不优
然后暴力即可

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



posted @ 2020-04-30 22:00  神山识  阅读(518)  评论(0)    收藏  举报