NOI2016题解

Day1

T2 网格

答案只可能是-1,0,1,2。
1.
先判断答案是否为0,相当于要判空格子是否连通。假如不连通,相当于有空格子被一些障碍点围住了(联想一下围棋。。)。那么我们按八连通把障碍的联通块搜出来,然后对于每个联通块,判断与他们八连通的空格子是否属于一个联通块(四连通),假如不是,则这幅图不连通。
2.
接下来答案为1相当于存在一个割点。首先做一些定义,与某个障碍点八连通的空格定义为1级空格不是1级空格但与某个1级空格八连通的空格定义为2级空格。那么显然,割点只能是1级空格。接下来我们对1级空格以及2级空格建图,假如两个空格四连通那么连边,最后判断在新图是否存在是1级空格的割点即可。
注意在 n=1 m=1 的情况下答案最多为1。

T3 循环之美

首先要知道如何判断一个分数 xy k 进制下是否是纯循环的。这等价于:
存在一个 l0 ,使得:
x×klx(mody)

由于 (x,y)=1 ,那么等价于 kl1(mody) ,最终推出 (k,y)=1

那么原问题就变成了:
给定 n,m,k ,求出

==i=1nj=1m[(i,j)=1][(j,k)=1]i=1nj=1,(j,k)=1md|i,d|jμ(d)d=1,(d,k)=1nμ(d)ndj=1,(j,k)=1md1

众所周知我们可以对 d 分成 O(n) 块,然后每一块的 nd,md 是相同的。
最后相当于要对于每一块的端点 r ,求出
S(r)=i=1,(i,k)=1rμ(i)T(r)=i=1,(i,k)=1r1

不妨设 k=pcii ,令 S(i,r) 表示 k 互质定义为与 k 的前 i 个质因子互质的意义下的 S(r) T(i,r) 同理。

那么转移有:

S(i,r)=S(i1,r)μ(pi)S(i,rpi)μ(x)S(i)T(i,r)=T(i1,r)T(i1,rpi)

对于 S(0,r) 直接用杜教筛求出来。那么总的复杂度就是
O(ω(k)n+n23) ,其中 ω(k) 表示 k 不同的质因子个数。

Day2

T1 区间

先把区间按长度排序,然后离散化。接下来枚举长度的右端点,显然左端点是单调不降的。这样两个指针扫,用线段树维护每个位置被多少个区间覆盖,合法性直接看最大值是否合法即可。

T2 国王饮水记

可以非常简单的弄出一个dp转移方程

F[i][j]=maxk<j{F[i1][k]+S[j]S[k]jk+1}

其中 S 表示只保留比 A[1] 大的,且从小到大排序的 Ai 的前缀和。

这个Dp的复杂度是 O(N3P) 。然后很显然的,这条式子也可以看作

F[i][j]=maxk<j{S[j](S[k]F[i1][k])j(k1)}

那么每一层,我们对 (j1,S[j]F[i][j]) 构下凸壳,那么下一层的转移是可以直接在凸壳上单调地扫的。
这样复杂度就变为 O(N2P) 了。

比较Trick的一个地方是,我们可以先用double求出每个 F[i][j] 是由哪个 k 转移过来的。最后再用高精度跑一遍。
复杂度变成了 O(N2+NP) ,不太能过。

最后的一个优化是,最优方案中,长度超过1的段数不会超过14( logNh )段,那么我们可以先Dp出前14层的答案(因为每一段的长度是递减的),最后再直接扫一遍计出答案就好了。
复杂度为 O(NlogNh+NP)

代码:
Day1 Grid
Day1 Cyclic
Day2 Drink

你可能感兴趣的:(总结)