zoukankan      html  css  js  c++  java
  • 南外联测 191112 做题总结

    Game

    重述题意:

    有这样一个游戏, 这个游戏里有n只怪, 每只怪血量 (a_i)

    每次攻击时, 玩家选择一个数(p), 使得

    for(int i = p; i <= min(n, k+p-1); i++) {
    	a[i] -= k+p-i;
    }
    

    求最小的k, 使得玩家可以通过m次攻击使得所有(a[i] < 0)

    数据范围:

    50% data: (n le 10^3)

    100% data: (n le 10^6, m le 1e9, a[i] le 1e9)

    首先明显 k 具有可二分性。

    对于每一个k,操作的方法只有: 对(a_i)数列顺序“施加攻击”。

    但是怎么模拟这个操作呢?毕竟每次都区间减等差数列的数据结构 非常高级,而且难写

    (当然写好暴力区间减就50分到手 再一次说明写暴力重要性

    形式化的讲, 每次攻击(a_i) 需要施加 (l = lceil frac{a_i}{k} ceil) 次攻击, 影响一直波及到 (a_{i+k-1})

    考虑差分。 定义 (Delta a_i = a_{i+1} - a_i)

    则有: (Delta a_i ' = Delta a_i + l) 。 所以 区间加等差数列等于区间差分加上一个固定的数

    而对(forall Delta a_x, i le xle i+k-1), 都有上式成立。 故对每个操作,打上一个“区间减法”标记就可以了。

    (其实这个标记的真正含义是二阶差分

    考后总结

    1. 50分暴力必须要写。 写了可以对拍。
    2. 二分时注意 解区间开闭性和边界, 二分其实有很多坑的。重点要记住, 二分区间一致是一个 半开半闭 区间。
    3. 数组未初始化, 调了40分钟(哭哭哭。
    4. 其实k = 0的情况是存在的, 但是不能写进二分的判定里(若是让k = 0 ,那么判断时会除以0)
      1. 所以k=0情况要特判。

    Friend

    百度地图的实时路况 简化版。

    考后感想

    特别要注意: 这张图是有重边和自环的。

    我没有给边判重,得20分

    判重之后, 满分!!

    Revenge

    重述题意:

    有一颗n个点的树, 每个点有一个颜色,总共有c种颜色。求最短的树上路径(一个点最多经过一次),使得路径上每种颜色的点都有。

    60% data: (n le 2000)

    100% data : (cle 9, n le 20000)

    这道题我在考试时想到的思路是这样的(类比求树的直径):

    [egin{align} 动态规划:\ &f(i,sta) = 以点i为根,经过点集为sta的最短路径长度&\ &g(i,sta) = 以点i为根,经过点集为sta的次短路径长度 end{align} ]

    但是其实这样无法保证最短路径和次短路径不相交 . 保证 不相交 才是最重要的.

    但是我却写了这个错误的解法. 所以最后没时间调试, 我没分了.

    考后感想

    其实, 通过n次(dfs)就可以得到60分.

    所以, 一个方法务必想清楚为什么正确!!不能确定正确的话, 先写个暴力.

    100分做法:

    动态规划: 仔细看, 定义改成了 (f(i,sta) = 以点i为根,经过点集至少为为sta的最短路径长度)

    转移时, 可以优化:

    [{DP:} egin{align} \ &ans =min _s f(u, s) + f(v,s')\ &f(u, s+c_u) = min {f(v, s+c_u) + 1, f(u, s)} end{align}]

    复杂度 (O(n*2^n))

    注意!!

    (f(i, sta))(sta)至少 经过点集为sta的最短路径长度

    这个至少 很重要。 否则, 这道题就需要用(SOSdp), 一种(FWT)的变体来更新ans了。

    这里有一篇(SOSdp)的博客: https://blog.csdn.net/weixin_38686780/article/details/100109753

    (原汁原味英文版: https://codeforces.com/blog/entry/45223

    不过现在就先不学了。

    怎么处理这个 至少 呢? (不用枚举子集)

    再加一个状态转移方程: (f_{u, s} = min { f_{v,s} + 1, f_{u, s}})就可以了。(有点意思!)

    这样, 对于任意一条路径, 所有可能的 忽略某些点 的方案都会被统计到。(毕竟“至少” 就是要 忽略某些在路径上的点)

  • 相关阅读:
    ubuntu下文件安装与卸载
    webkit中的JavaScriptCore部分
    ubuntu 显示文件夹中的隐藏文件
    C语言中的fscanf函数
    test
    Use SandCastle to generate help document automatically.
    XElement Getting OuterXML and InnerXML
    XUACompatible meta 用法
    Adobe Dreamweaver CS5.5 中文版 下载 注册码
    The Difference Between jQuery’s .bind(), .live(), and .delegate()
  • 原文地址:https://www.cnblogs.com/Eroad/p/11846163.html
Copyright © 2011-2022 走看看