1001. Vertex Cover
题意:有一个贪心算法求最小顶点覆盖是每次选出度数最大的点然后删去,输出一个图使得这个算法跑出来的答案是你给出的答案的三倍及以上。
题解:
构造一个二分图,设左边有 nn
个点,标号是 1 ~ n1 n
。对于每个 i \in [1, n]i∈[1,n]
,都在右边新建 \lfloor \frac{n}{i} \rfloor??i??n???
个点,每个点都选择左边的 ii
个点连 1 条边,使得左边每个点最多只被多加了一条边。这样构造完成后可以发现贪心的做法会把右边那 n \log nnlogn
个点当做一个覆盖集,实际上只需左边的 nn
个点即可。对于题目的要求可以设 n = 80n=80
。
1002. Party
题意:给出 20 * 20 的二分图,点有标号。10 组询问,每组询问一个 gg
,表示只考虑标号是 gg
的倍数的子图,求非空顶点的子集 VV
的数量,使得存在一个匹配盖住 VV
.
题解:每个询问分开解决。假设 VV
是由左边的 X + YX+Y
组成的,其中 XX
在左侧,YY
在右侧。使用广义的 Hall 引理,可以证明只要 XX
可以被某个匹配盖住,YY
也可以被某个匹配盖住(不需要是同一个匹配),那么 VV
也可以被某个匹配盖住。
所以,只需要 2^{20}2?20??
枚举 XX
的顶点自己,跑匹配就行了。聪明一点的话可以 dfs 枚举,维护增广路。
1003. Friend-Graph
题意:判定一个无向图是否有三个点的团或者三个点的独立集。
题解:Ramsey theorem,n >= 6 直接输出 Bad 否则暴力。
1004. A Secret
题意:给定两个串,求其中一个串 ss
的每个后缀在另一个串 tt
中出现的次数。
题解:把两个串都 reverse 一下,给 tt
做个 KMP 之后让 ss
在 KMP 出来的结果上跑一边就好了。
1005. CaoHaha‘s staff
题意:在笛卡尔坐标系下,画一个面积至少为 nn
的简单多边形,每次只能画一条边或者一个格子的对角线,问至少要画几条。
题解:如果一个斜着的矩形长宽分别是 a, ba,b
,那么它的面积是 2ab2ab
。最优解肯定是离 \sqrt{\frac{n}{2}}√??2??n?????
很近的位置。想想 n=5n=5
时答案为什么是 77
然后在那个小范围内枚举一下就好了。
1006. Subsequence Count
题意:给出 01 串,要么询问某个区间内不同的 01 子序列数量,要么把区间翻转。
题解:先考虑怎么算 s_1, s_2, \ldots, s_ns?1??,s?2??,…,s?n??
的答案。设 dp(i, 0/1)dp(i,0/1)
表示考虑到 s_is?i??
,以 0/10/1
结尾的串的数量。那么 dp(i, 0) =dp(i - 1, 0) + dp(i - 1, 1) + 1dp(i,0)=dp(i?1,0)+dp(i?1,1)+1
. 11
也同理。
那么假设在某个区间之前,dp(i, 0/1) = (x, y)dp(i,0/1)=(x,y)
的话,过了这段区间,就会变成 (ax + by + c, dx + ey + f)(ax+by+c,dx+ey+f)
的形式,只要用线段树维护这个线性变化就好了。
1007. Palindrome Function
题意:...
枚举ii
之后就是计算区间[L, R][L,R]
内在base ii
下回文数的个数,直接dp就好了。
1008. The Karting
题意:线段上有 nn
个点,你要选 mm
个点组成一个环,代价是相邻两个点的距离 + 转弯的惩罚,问最大的代价。
题解:从左到右考虑 dp(i,chosen, parts)dp(i,chosen,parts)
表示考虑到 ii
,已经选了 chosenchosen
个点,左边有 partsparts
个连通块(肯定是若干条链)。然后考虑如果选点 ii
,因为是个环,所以肯定 ii
肯定是一进一处。讨论一下进出的方向:
(1) 如果是从左边进来,又从左边出去。那么对答案的贡献就是 +2x[i] + turn+2x[i]+turn
. 同时,也会连通块 -1.
(2) 对称地,如果从右边进来出去,那么贡献是 -2x[i] + turn?2x[i]+turn
. 同时多一个连通块(它自己)。
(3) 如果左进右出(或者反过来),那么没有任何影响。
注意最后一下要把环闭合,有个特别的转移。
1009. The Designer
题意:(看图)
题解:用 http://en.wikipedia.org/wiki/Descartes%27_theorem .
看上去需要解二次方程,实际上这个二次方程的两个根就是左右两个圆的大小。那么我们用 vieta 定理,就能得到连续 3 个圆的一个线性关系,用这个线性关系递推就好。
1010. Graph Of Zhuper
题意:...
题解:令f(n)f(n)
表示nn
个点带标号的连通图数目g(n)g(n)
是nn
个点带标号的无向图数目,那么g(n)=2^{n(n-1)/2}g(n)=2?n(n?1)/2??
,f(n)=g(n)-\sum\limits_{k=1}^{n-1}\binom{n-1}{k-1}f(k)g(n-k)f(n)=g(n)??k=1?∑?n?1??(?k?1?n?1??)f(k)g(n?k)
。分治FFT就可以算出每个f(n)f(n)
。
令h_d(n)h?d??(n)
是带标号nn
点简单无向图且每个连通块大小是nn
倍数的方案数,那么显然答案就是\sum\limits_{d|n}\phi(d)h_d(n)?d∣n?∑???(d)h?d??(n)
。
构造多项式F(x)=\sum\limits_{i=1}^{n/d}f(id)x^iF(x)=?i=1?∑?n/d??f(id)x?i??
,那么G(x)=\sum\limits_{i=0}^{\infty}\frac{F^i(x)}{i!}=e^{F(x)}G(x)=?i=0?∑?∞???i!??F?i??(x)??=e?F(x)??
的x^{n/d}x?n/d??
的系数就是h_d(n)h?d??(n)
。搞个多项式expexp
就好了。
1011. Convolution Layer
题意:...
题解:枚举了最外层的三个 \sum∑
之后,可以发现里面是一个经典的问题:给一个大矩阵和小矩阵,求小矩阵能放的每个位置和对应位置叠上的大矩阵的一个函数。做法的话因为字符集只有 2 所以首选 bitset,把 -1 看作 1,1看作 0。先搞出大矩阵每一行的 bitset,和小矩阵串起来的 bitset,因为只有 121 位所以可以直接用 __int128。然后首先枚举列,把每行的对应位置上 11 个 bit 扣出来,挨个拼成一串再和小矩阵的 bitset xor 就好,复杂度就是那个七重循环再除个压位的常数