ICPCCamp 2017. Day 1. ftiasch's Contest 5 题解
ICPC camp,题目质量挺高。
A \(\color{Gold}\bigstar\)
想了一下按值域从大到小放,相当于每次分裂成两个子问题。
直接做是 \(O(n^3)\) 的,看着不太能优化。
考虑从前往后直接做,设 \(f_{i,j,k}\) 表示填了前 \(i+j\) 个,\([i,i+2]\) 中最大的是 \(i+j\),他的值是 \(k\) 的答案。
然后就继续放数,枚举一下下一个产生影响的最大值,前缀和后缀和转移一下就是 \(O(n^2)\) 的了。
B \(\color{green}\bigstar\)
没啥意思题,分类讨论所有六元非简单环情况,然后爆算。
01 矩阵乘法用 bitset 做,\(O(\frac{n^3}{w})\)。
C \(\color{Gold}\bigstar\)
好题啊。
首先直接暴力是分拆数级别的,过不了。
答案需要对 \(2\) 取模,构造了一下对称,发现构造不出。
本质是只要把联通情况解决就行,也就是把所有连通块个数不是 \(1\) 的去掉就行。
假设我选了一个点集 \(S\),设 \(c(S)\) 表示连通块个数,那么:
这样就把个数不是 \(1\) 的全部去掉了,然后只有一个的也自动对 \(2\) 取模,因此答案是这个除以 \(2\)。
考虑一下这个的组合意义,相当于每个点染黑白,或者无色,要求不能有一条边左右两个点分别染了黑白。
暴力状压,设 \(\max |a_i-b_i|=L\),复杂度 \(O(n3^L)\)。
D \(\color{blue}\bigstar\)
神秘背包,一眼同余最短路一下。
取 \(L=\text{lcm}\{1,2,3,...,n\}\),然后可以把每个物品的体积和对 \(L\) 取模,然后剩下的部分的和只有 \(nL\),可以暴力,然后相当于是一堆等差数列的并,直接做就行。
还有【数据删除】做法。
E \(\color{green}\bigstar\)
经典题了,把一个点的权值变成到根路径的权值和,然后 \(w_{lca(x,y)}\) 变成两条链的并的和,树剖简单维护就是双 \(\log\)。
F \(\color{blue}\bigstar\)
相当于是一个矩阵乘法,但是要求出每个点值。
倍增显然不太行,考虑分块一下,设先把 \(P^1,P^2,...,P^B\) 预处理一下。
遇到新加点就必须把矩阵修改一下,然后正常每 \(B\) 个之后做一次向量乘矩阵,然后答案注意到只需要求单点,因此可以 \(O(n)\)。
总复杂度 \(O(n^3B+mn^2+\frac{L}{B}n^2+Ln)\)。
随便取个 \(B=n\),复杂度 \(O(n^4+mn^2+Ln)\)。
G \(\color{green}\bigstar\)
只能递推,前面一个区间的乘积,但是满足双指针。
最近做过类似的,直接对底栈维护一下,左边栈空了右边就全部过去即可。
复杂度 \(O(nm^3)\)。
H \(\color{green}\bigstar\)
暴力打表的,证明有时间再读论文。
I \(\color{red}\bigstar\)
神秘数据结构维护 dp,还不会。
J \(\color{red}\bigstar\)
计算几何,不会。
K \(\color{blue}\bigstar\)
有点意思。
考虑对于一个集合,怎么选出这个集合。
对于 EC-Final 部分,肯定是选一个前缀,能选就选,也就是选到第一个不选的位置。
然后我们知道了一个一定不选的位置,然后去上面的比赛里面,找一个前缀选,下一层是一个 \(2^c-1\) 的东西,树状数组维护一下即可。