zoukankan      html  css  js  c++  java
  • 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] \ ightarrow (R[i]-R[j])\%P=(R[x]-R[y])\%P \ ightarrow (R[i]-R[j]-R[x]+R[y])\%P=0 \ ightarrow (i^2+i-j^2-j-x^2-x+y^2+y)\%P=0 \ ightarrow (i+j)(i-j)\%P=(x+y)(x-y)\%P \ ightarrow 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} floor + 1)条边的边权(排序过的),其中(K(1 lt K lt 50))是定值。
    • 求路径长度在([L,R])之间的最小路径权值,其中(1 le L le R le 50)

    思路

    • 假设最后的答案为(Ans),路径上边权不超过(Ans)的条数记为(F),则(length lt KF o 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( o)权值为正的点,流量为权值;原图的边,流量为(infty);权值为负的点( o)T,流量为权值的绝对值。
    4. 最大权=正权和-最小割

    代码

  • 相关阅读:
    ES6 class -- Class 的基本语法
    ES6 Promise --回调与Promise的对比、信任问题、错误处理、Promise的状态、以及Promise对象的常用方法
    移动端调试,手机缓存清不掉
    JAR 介绍-百度百科
    一致性哈希的基本概念
    Java线程池的配置
    java多线程面试题整理及答案(2018年)
    Java多线程面试题整理
    IntelliJ Idea 常用快捷键
    RESTful规范
  • 原文地址:https://www.cnblogs.com/mcginn/p/5824000.html
Copyright © 2011-2022 走看看