2016 Multi-University Training Contest 9

2016 Multi-University Training Contest 9

HDU 5845 Best Division

题意

  • \(N(1 \le N \le 10^5)\)个数\(A_i(0 \le A_i \lt 268435456)\),将这\(N\)个数划分成\(K\)段,每段的长度不超过\(L\),且每段的异或和小于等于\(X(0 \le X \lt 268435456)\)
  • 求最大的段数\(K\)

思路

  • \(f[i]\)表示以位置i结尾的最大段数
  • \(sum[i]\)表示\(A_1 \oplus A_2 \oplus ... \oplus A_i\)
  • 对于位置i来说,需要在\([i - L, i)\)找到位置j,满足\(sum[i] \oplus sum[j] \le X\)使得\(f[j]\)最大。
  • 考虑维护一棵01字典树,叶子节点记录对应\(sum\)值的最大长度,非叶子节点记录子树的最大长度。
  • 当查询一个\(sum[i]\)值时:
  1. 若对应位置的 \(X\) 为1,\(sum[i]\)\(sum[j]\)相等,则\(sum[i] \oplus sum[j] \lt X\),就可以取对应节点的dp值;若\(sum[i]\)\(sum[j]\)不相等,则要往下走。
  2. 若对应位置 \(X\) 为0,则\(sum[i]\)\(sum[j]\)必须相等,否则异或和会大于 \(X\)
  • 因为有 \(L\) 的限制,所以需要进行删除操作。删除时,只要判断对应\(sum\)值节点的dp值是否等于当前的\(f[i - L - 1]\)。如果不相等,说明在\([i-L, i)\)中有相等\(sum\)值,此时这个位置的最大长度最小为\(f[i-L-1]+1\),所以在相等的情况下就可以把相应的dp值置为-1。

代码

HDU 5847 Different Sums

题意

  • 构造一个长为\(N(N \le 2000)\)的数组,每个数不超过\(3N+18\)
  • 任意连续子序列(共\(\frac{N(N+1)}{2}\)个)的和均不相同。

思路

  • 令前缀和\(Sum[i]=2*i*P+\frac{i(i+1)}{2}x \% P\),其中\(P \gt N\),且是质数。
  • 证明,设\(R[i]=\frac{i(i+1)}{2}x \% P,Sum[i]-Sum[j]=Sum[x]-Sum[y]\)
  1. 因为\(|R[i]-R[j]| \lt P,|R[x]-R[y]| \lt P\),所以\(i-j=x-y\)
  2. \(Sum[i]-Sum[j]=Sum[x]-Sum[y] \\ \rightarrow (R[i]-R[j])\%P=(R[x]-R[y])\%P \\ \rightarrow (R[i]-R[j]-R[x]+R[y])\%P=0 \\ \rightarrow (i^2+i-j^2-j-x^2-x+y^2+y)\%P=0 \\ \rightarrow (i+j)(i-j)\%P=(x+y)(x-y)\%P \\ \rightarrow i+j=x+y\)
  3. 综合1.和2.,可知\(i=x,j=y\),即任意连续子序列和均不相等。

代码

HDU 5852 Intersection is not allowed!

题意

  • 一个\(N*N(N \le 10^5)\)的棋盘,有\(K(K \le 100)\)个棋子位于\((1,a_i)\),要走到相应位置\((N,b_i)\)
  • 每个棋子只能往下或往右走。
  • 求路径不相交的方案数,对1000000007取模。

思路

代码

HDU 5854 K-th value

参考

题意

  • 给一棵\(N(N \leq 10^5)\)点的树,每条边有边权\(a_i(a_i \le 10^9)\)
  • 一条简单路径的权值为\(\lfloor \frac{length}{K} \rfloor + 1\)条边的边权(排序过的),其中\(K(1 \lt K \lt 50)\)是定值。
  • 求路径长度在\([L,R]\)之间的最小路径权值,其中\(1 \le L \le R \le 50\)

思路

  • 假设最后的答案为\(Ans\),路径上边权不超过\(Ans\)的条数记为\(F\),则\(length \lt KF \to KF-length>0\)
  • 那么将边权不超过\(Ans\)的边记为\(K-1\),否则记为\(-1\)。用\(f[i][j]\)表示从点i出发走j步的最大和。
  • 对于树上的每个节点来说,一种是作为简单路径的端点,这个直接判断即可;一种是作为中间节点,即两条分支,设分别走了\(x\)步和\(y\)步,则\(L \le (x + 1) + (y + 1) \le R\),假设\(x\)从大到小枚举,则\(y\)越来越大,我们需要取相应范围\(max\{f[v][y]\}\),这个可以通过单调队列优化。

代码

HDU 5855 Less Time, More profit

题意

  • \(M(M \le 200)\)个商店,每个商店需要一些工厂提供原料以获得收益\(pro_i\)注意是需要这些工厂全部建造才能获得收益,而不是只要一个工厂就可以。
  • \(N(N \le 200)\)个工厂,每个工厂需要\(t_i\)天建造,费用为\(pay_i\)
  • 求最少需要几天使得获得的收益不小于\(L\),在天数最少的情况下,求最大收益;如果收益总是小于\(L\),则输出"impossible"。

思路

  • 当天数确定时,即变成了最大权闭合图模型。
  • 天数和收益是正相关的,所以可以二分天数。
  • 最大权闭合图:
  1. 论文:最小割模型在信息学竞赛中的应用
  2. 定义:简单讲,就是如果选了一个点,则它的所有后继节点都要选,权值最大的闭合图即最大权闭合图。
  3. 建图:S\(\to\)权值为正的点,流量为权值;原图的边,流量为\(\infty\);权值为负的点\(\to\)T,流量为权值的绝对值。
  4. 最大权=正权和-最小割

代码

posted @ 2016-08-30 22:59  mcginn  阅读(339)  评论(0编辑  收藏  举报