zoukankan      html  css  js  c++  java
  • Kotlin Heroes 5: ICPC Round 题解 (A-H)

    A. 枚举(i),答案是第(i)大的数乘(i). 复杂度为排序复杂度(O(nlog n)).
    B. (w)一定要标记,连续的(v)只需要标记其中一半(下取整). 复杂度(O(|s|)).
    C. 枚举免费的数量(i),求前(ik)大中最小(i)个值的和. 复杂度为排序复杂度(O(nlog n)).
    D. 考虑让前(i)小的人换笔,那么需要满足前(i)小的和大于(ge n+1). 复杂度为排序复杂度,桶排可以(O(n)).
    E. 结论:假设数组已排序,答案为(p_i=(i-1+k)\%n+1),遍历(k)的值即可. 复杂度(O(n^2)).
    F. 二分答案. 每次贪心取前面一段最小的,使得它去掉多余的数后,和小于二分值. 使用大根堆来维护加入的数. 复杂度为(O(nlog(a_max x)log x)).
    G.
    结论1:B每次应该取大于(a)的最小值.
    结论2:如果(n=2k),A应该按顺序取第(k)小,第(k-1)小,(cdots).那么答案是前(k)大的和减去前(k)小的和.
    区间DP,(dp[i][j])表示前(i)个数已经选了总长度为(2j)的区间的最大值,转移是不选,或者选一段长度为偶数的区间,收益是最大一半的和减去最小一半的和.
    H.
    注意到问题实质上是一维的,记(s)(a)(b)合并后去重的数组,那么对(s)中每个值,对应(c)中某个二维前缀,并且这些前缀是单调递增的.
    (p_i=max_{a_jle s_i}max_{b_kle s_i}c_{jk}),只需要(s)数组和(p)数组就能得到答案.因此模拟整个过程只需要(O(n+m))的复杂度.
    考虑(k)的影响,实际上就是枚举某个(i),使得所有的(jge i,p_j=max(p_j,p_i+k)).因此复杂度是(O((n+m)^2)).

    尝试很久才猜到E的结论,但看前排E基本上都是秒出,也许是个经典题?或者证明非常显然?

  • 相关阅读:
    部分页面开启宽屏模式
    门户diy实现翻页功能的方法
    git命令详解,从入门到装逼
    array方法常用记载
    vue 生命周期的理解(created && mouted的区别)
    微信小程序传值的几种方式
    data-*
    本地存储和会话存储以及cookie的处理
    vue的安装和项目构建
    进击的UI----------动画
  • 原文地址:https://www.cnblogs.com/Heltion/p/13967306.html
Copyright © 2011-2022 走看看