• NOI-无能狂暴乱做


    2017-2020 年 NOI 乱做

    by tuifei-oier

    菜 b 做不动,留空就爬了。

    NOI2017

    这一年的题总体上还比较可做。

    T1 整数

    比较恶心的送分题,做法多样但是都码量大/细节多。

    一种相对好写的做法:

    注意到每次给一个二进制位 +1 的操作均摊是 (O(n)) 的,由此考虑分别维护所有 + x 操作的和与 - x 操作的和。

    考虑查询一个二进制位,只需要考虑第 (i) 位是否会被前 (i-1) 借位,判断两个值的前 (i-1) 位组成的数的大小关系即可:找到从高到低第一个不同的二进制位,可以使用 set 维护。

    同时可以压位维护,每 (w) 个二进制位压进一个数维护。

    时间复杂度大致是 (O(frac{nlogn}{w})) 级别。

    T2 蚯蚓排队

    处理出所有串的出现次数,用 hash 就可以简单地进行查询,考虑如何在修改同时维护。

    如果只有 1 操作,总共只有 (O(nk)) 级别的串,而 2 操作最多只会删除 (O(k^2)) 个原有的串,且只有 (10^3) 个,暴力做即可。

    时间复杂度 (O(nk+10^3k^2))

    T3 泳池

    考虑 1D1D 的 dp,设 (dp_i) 表示长度为 (i) 的矩形中,最大子矩形面积不超过 (K) 的概率。

    (f_{i,j}) 表示长度为 (i) 的矩形,最低高度为 (j) 的概率。

    转移:

    [f_{i,j}=sum_{k=1}^isum_{l=1}^{K/(k-1)}f_{k-1,l}sum_{p=1}^{K/(i-k)}f_{i-k,p} ]

    即枚举高度最低的位置,限制两边面积不超过 (K)

    前缀和优化可以做到 (O(K^2ln K))

    [dp_i=sum_{j=0}^{K}dp_{i-j-1} imes(1-q) imes f_{j,K/j} ]

    即枚举最后一段有高度的区间的长度。

    时间复杂度 (O(nK))

    考虑优化,常系数齐次线性递推,时间复杂度 (O(K^2log n+K^2))

    T4 游戏

    比较简单的题,关键是想到限制可以由 ”3-sat“ 转化为 2-sat。

    考虑每条边 i x j y,如果:

    1. (i) 可以选 (x) 并且 (j) 可以选 (y),就是正常的 2-sat 连边;
    2. (i) 不可以选 (x),则这条边可以忽略;
    3. (j) 不可以选 (y),则等于 (i) 不可以选 (x),连边限制即可。

    考虑处理 x,只需尝试替换成 AB 即可,这样就涵盖了所有情况。

    时间复杂度 (O(2^8(n+m)))

    T5 蔬菜

    中等难度的贪心。

    第一步,对于 (s_i) 的处理,把一种蔬菜拆成价值为 (a_i)(a_i+s_i) 的两种蔬菜即可。

    接下来,DDL 限制让人不难想到 “时间逆转” 的套路,考虑倒过来考虑每天进一些蔬菜,就没有后效性了,可以贪心。

    为了保证复杂度,可以考虑把蔬菜分成两种:有限数量的蔬菜和自第 (i) 天开始每天增加 (x) 的蔬菜。

    接下来考虑每组询问怎么解决,发现从询问 (p) 到询问 (p-1) 的计算过程基本一致,唯一的区别是少取 (1) 天即 (m) 个蔬菜,直接删除价值最小的 (m) 个蔬菜即可。

    时间复杂度 (O(nmlog n))

    T6 分身术

    计算几何,直接爬了。

    NOI2018

    相对 NOI2017 要更难一点,有两道难度大的题。

    T1 归程

    Kruscal 重构树。

    T2 冒泡排序

    可以证明:序列非法当且仅当存在 (i,j,k) 满足 (i<j<k),并且 (p_i>p_j>p_k)

    考虑据此 DP,设 (dp_{i,j}) 表示前 (i) 个数,最大值为 (j) 的方案数。

    转移如下:

    [dp_{i,j}=dp_{i-1,j} imes[i-1le j]+sum_{k=i-1}^{j-1}dp_{i-1,k} ]

    第一种转移是填上一个 (1-j) 中未出现在前 (i-1) 个位置的最小值。

    第二种转移则是填上新的最大值 (j)

    把转移放在组合数网格上,发现,(dp_{i,j}=inom{i+j-1}{i-1}-inom{i+j-1}{i-2}),可以做到 (O(n))

    考虑怎么计算字典序的限制,类似数位 DP,从 (1)(n) 每次计算第 (i) 位开始不同的排列,之后的部分可以根据刚才 DP 的结论 (O(1)) 计算方案,不满足条件时 break 即可。

    T3 你的名字

    比较综合的字符串题,包含了大部分常用的 SAM 套路。

    T4 屠龙勇士

    把需要满足的方程列出来,不难发现要解同余方程,直接 exCRT 就可以了。

    T5 情报中心

    咕了

    T6 多边形

    咕了

    NOI2019

    这一年的题难度整体较高,思维性比较强。

    T1 回家路线

    考虑设 (dp_i) 表示以按时间排序后第 (i) 条边结尾的路径的最小费用,可以简单地 (O(n)) 转移。

    考虑优化,不难发现可以斜率优化,时间复杂度 (O(mlog m))

    T2 机器人

    首先考虑怎么判断给定序列的合法性,一个简单的想法是使用单调栈做到 (O(n)),但是这个做法不好拿来计数,考虑换一个做法,即使用笛卡尔树,只需判断每个点的左右子树大小。

    考虑计数,由笛卡尔树想到利用区间 DP 计数,设 (dp_{l,r,x}) 表示区间 ([l,r]) 的最大值为 (x) 的方案数,转移时枚举最大值位置即可,复杂度 (O(nB_i))(只有 (O(n)) 个有效状态)。

    考虑优化,归纳证明 (dp_{l,r,x}) 是不超过 (r-l+1) 次,段数 (O(n)) 级别的分段函数,每一段维护 (O(n)) 个点值即可,时间复杂度 (O(n^3)) 左右。

    T3 序列

    题目本质是选出 (K) 个二元组 ((i,j)),满足 ((i,i)) 的数量 (ge L)

    首先考虑建出费用流模型,(S o a_i o b_i o T) 表示选二元组 ((i,i))

    然后:(a_i o C o D o b_j),表示选二元组 ((i,j)),将边 (C o D) 的流量设置成 (K-L) 即可。

    据此优化,采用模拟费用流,即贪心确定每次的增广路。

    T4 弹跳

    naive 的想法是用树套树优化建图,但是空间不能接受。

    考虑用 KDT,同时不显式的把边连上,而是采用 Dijkstra 的思路每次在 KDT 上松弛一个矩形即可。

    时间复杂度 (O(nsqrt n+mlog m))

    T5 斗主地

    首先考虑暴力,不难发现题目的洗牌方式等价于在 (inom{n+m}{n}) 种可能序列中等概率随机一个。

    (dp_{i,j,k}) 表示当 (A_i=k) 时,原来牌堆的第 (i) 张变成第 (j) 张的概率,不难发现就是一个组合数的形式。

    然后,把它写成矩阵,就可以矩阵乘法做暴力了。

    考虑优化,猜想:若洗牌前 (i) 位置的期望为 (f(i)) 时满足 (f(i)) 是一个一次/二次多项式,则洗牌后 (f'(x)) 也是一个一次/二次多项式。

    然后就只需每次算出三个点值,可以做到 (O(1))

    总复杂度 (O(36m+Q))

    T6 I 君的探险

    交互不想整,爬了。

    NOI2020

    两道防 AK 题,其余题目也难度不低。

    T1 美食节

    不难想到暴力 DP 的思路,思考一下就可以转化成矩阵快速幂的形式,复杂度 (O((5n)^3klog T))

    考虑优化,预处理转移矩阵的 (2^t) 次方,由于只要求第一行第一列的值,(O((5n)^2)) 矩乘即可。

    T2 命运

    有一个简单的 (O(n^2)) DP 思路,然后用线段树合并来优化即可。

    T3 时代的眼泪

    分块科技,爬了。

    T4 制作菜品

    通过数据范围提示,可以证明:当 (mge n-1) 时,必定有解。

    构造方法:

    假设 (d_i) 有序,每次把 (d_1+d_n) 去拼一道菜,并且用完 (d_1)(d_n) 剩下的放回去。

    证明,当 (m=n-1) 时:

    1. (d_1<K),显然;
    2. (d_1+d_n>K),自证不难;

    由此,每次做一道菜后 n--,m--,归纳证明。

    考虑 (mge n),直接把 (d_n) 拿出来单独做一道菜直到 (m=n-1)

    考虑 (m=n-2),假设如果一道菜由 (i,j) 两种材料组成就在 (i,j) 之间连一条边,则边数不超过 (n-2),必定有多个连通块。

    也就是说,你可以把所有 (n) 分成独立的两部分分别构造解,而每个部分都是 (m=n-1) 的。

    考虑划分,即找一个集合 (S) 使得 (sum_{iin S}d_i=(|S|-1)K),把括号拆开移项,得 (sum_{iin S}(d_i-K)=-K),0/1 背包即可,采用 bitset 压位。

    时间复杂度 (O(n^2K/w))

    T5 超现实树

    咕了

    T6 翻修道路

    nb 弦图,一分不会。

    总评

    不难发现题目都很难。

    我太菜了,咋整啊。

  • 相关阅读:
    jquery.FixedColumns 滚动兼容问题
    面向对象三大特性:继承、封装、多态
    jquery.chosen.js和select2使用笔记
    Git查看、删除、重命名远程分支和tag(转载)
    GIT忽略追踪文件
    git代码量统计(转载)
    SQL SERVER如何收缩日志-通过脚本收缩(转发)
    GIT常用命令
    解决 git extensions 每次提交需要输入用户名和密码
    Mysql 5.7初始化密码
  • 原文地址:https://www.cnblogs.com/tuifei-oiers-home/p/14728382.html
Copyright © 2020-2023  润新知