2015 ACM多校训练第一场

题外话

这个暑假以前就决定要把这次多校的所有题全补了,中间断断续续,总算把第一场的题补全了,鄙视一下颓废的自己。。。


hdu 5288(1001) OO’s Sequence

Solution

水题,定义两个数组$L[i], R[i]$示第i个数左侧和右侧最接近它且值是a[i]因子的数字的位置,统计贡献即可。由于a[i]范围很小,因子数很小,暴力统计更新l,r即可。

Code


hdu 5289(1002) Assignment

Solution

水题,很容易想到先用st表预处理区间最大最小值,然后枚举左端点,二分右端点检查是否满足即可。复杂度$O(NlogN)$,也可以用单调队列维护最值

Code


hdu 5290(1003) Bombing plan

Solution

这题比赛时候没时间看,其实赛后发现并不是很难。看数据范围很容易往O(NW)上去想。于是不难想到dp
定义两个数组
$f[i][j]$表示以i为根的子树全部破坏掉,还能向上破坏最多j的距离,需要的最少点数
$g[i][j]$表示以i为根的子树未被全部破坏掉,且未被破坏的点距离i最远为j,需要的最少点数

  • (1)不取i点,则
    $$f[i][j]=f[son][j+1]+\sum_{l是i的其他孩子} min(f[l][0],f[l][1],…,f[l][j+1],g[l][0],g[l][1],…,g[l][j-1])$$

    $$g[i][j]=g[son][j-1]+\sum_{l是i的其他孩子} min(f[l][0],f[l][1],…,f[l][j],g[l][0],g[l][1],…,g[l][j-1])$$

  • (2)取i点则
    $$f[i][w[i]]=1+\sum_{l是i的孩子} min(f[l][0],f[l][1],…,f[l][w[i]+1],g[l][0],g[l][1],…,g[l][w[i]-1])$$
    很容易想到用两个数组$ff,gg$分别维护$f,g$的最小值,复杂度$O(NW)$,具体实现的时候注意下边界$0$的情况即可。仔细想想,转移方程还是比较容易得到的

Code


hdu 5291(1004) Candy Distribution

Solution

考虑最暴力的dp,$dp[i][j]表示分配完第i种物品,A比B多j个的方案数$,然后dp转移的时候枚举分给A$x$个,B$y$个,则$dp[i][j+x-y]+=dp[i-1][j]$。考虑第$i$种物品有$s$个,$x+y\le s$时可转移,则$dp[i-1][j]$对$dp[i][j]$的贡献有$\frac{s}{2}+1$次($x=y=0…x=y=\frac{s}{2}$),下发现,j每变化2,贡献-1。奇偶两种情况考虑时,这个东西类似于等差数列,差分两次后我们就可以完成递推了。复杂度$O(n^3)$

Code


hdu 5292(1005) Pocket Cube

Solution

这个题就是个找规律的题,看了题解才会做QAQ。。。

Code


hdu 5293(1006) Tree chain problem

Solution

比赛时没看,赛后发现是个很裸的题= =。
考虑dp,$dp[i]$表示以$i$为根的子树的最优值,则
$sum[i]=\sum_{j\in son[i]} dp[j]$
容易想到有两种转移

  • (1) $dp[i]=sum[i]$
  • (2) $dp[i]=value[p]+\sum sum[k]-\sum dp[k]$ $(链p的lca是i,k是链上的节点)$
    链上求和很容易想到树链剖分,复杂度$O(Nlog^2N)$

Code


hdu 5294(1007) Tricks Device

Solution

水题,最短路寻找道路边数最少的最短路,总边数减去最少条数为第二个问答案。
把最短路图抽出来建流量为1的边,最小割即为第一问答案。

Code


hdu 5295(1008) Unstable

Solution


平几题,给出中点很容易想到倍长的事情。如图,倍长$AF$,做$BG$平行于$AD$且$|BG|=|AD|$,容易看出三角形$FDA$和三角形$FCA’全等$
不妨固定BC,$A’$可以通过以$C$圆心,半径长为$da$,和以$B$为圆心,半径长为$2ef$的圆交点得到。
由于$A’GBC$是平行四边形,可以得到G的坐标。于是$D$的坐标可以通过以$C$为圆心,半径长为$cd$,和以$G$为圆心,半径长为$DG$(即$ab$)的圆得到。于是可以得到$A$的坐标

Code


hdu 5296(1009) Annoying problem

Solution

比赛时自己蠢一直没想出来,想过dfs序但没细想= =
其实每次插入的时候找两个dfs序最接近的点$x,y$一个大于$u$一个小于$u$即可。每次增加的花费是$dis[u]-dis[lca(x,u)]-dis[lca(y,u)]+dis[lca(x,y)]$,即为$u$到$x-y$链上的距离。删除时类似。
找不到这样的点时直接取最大和最小dfs序的两个点即可
为什么这样呢,给定固定点把它们连通得到的树一定是固定的。这样选点的目的是为了不让边重复。

Code

hdu 5297(1010) Y sequence

Solution

这个题比赛时我写的二分,一直T,= =非常蛋疼。赛后看题解和问别人才知道,可以迭代,迭代次数不会太多。
首先考虑反函数$f(x)$表示前$x$个数中Y-sequence的数量。我们迭代来算这个值,不用二分。
我们要求第$n$个Y-sequence,开始令$x=n$,如果$f(x)=now$,那么前$x$个数中有$n-now$个不是Y-sequence的数,那么我们令$x=x+n-now$,看看新的$f(x)$是否等于n即可。
我们每次只加了缺少的答案数,所以不可能超过正确答案。
迭代还是玄学啊。。。。新姿势get

Code


hdu 5298(1011) Solid Geometry Homework

Solution

比赛时以为是大型计算几何看都没看,赛后发现这是个SB题,把点带到平面和球面方程中,确定点在哪一边把结果异或一下考虑染色即可。

Code


hdu 5299(1012) Circles Game

Solution

自己太弱,不会扫描线,赛后补了下姿势。。
很容易想到扫描线处理圆,把圆变成树,然后就变成了经典博弈问题树上删边问题,具体可以看09年国家集训队论文<<组合游戏略述——浅谈SG游戏的若干拓展及变形>>。
结论是叶子节点$sg值为0$其余节点$sg$值为所以孩子节点$sg$值$+1$的异或和。

Code

完结撒花!
继续补题!>_<