NOI 真题模拟
06.21 : NOI2016 Day 1
期望:
。
实际:。
总结
不能默写 SA,没有测极限,被卡常。
一开始以为可以使用平面图欧拉定理来判断联通块个数。但是实际上可能比较困难:问题在于,在一般的计算中,所有的
[APIO2017]斑斓之地 能做的原因是黑色是联通的,所以只有在完全包含黑色的时候,才会出现一个空腔。
使用欧拉定理是尝试将网格图转变为单纯的数值,从而简化问题;但是另一种思路是建图(虽然可能丢失网格图的特殊性质,但是可能更容易使用图论工具),然后就直接是找到原图的割点了。
应该怎么想到呢?如果在想部分分的时候,能够把整张图的四联通连边都建立出来,应该就能想到了吧......
在考虑可能的位置时,很快就想到了拉出黑点边上的白点。但是在判断是否是
不会写割点.jpg
在推的过程中,遇到一步:
找到所有
,满足存在一个 使得 。
最后结论是
06.23 : NOI2016 Day 2
期望:
。
实际:。
总结
之前就做过的题。感觉和我的脑回路比较不同,我每次做这题第一步都要先枚举区间交点!!!
但是,注意到答案只和最长、最短区间的长度有关,所以暴力的话枚举两个区间的长度,然后判断是否存在合法的交点看起来更为合理。由于只要有一个交点就好了,所以可以线段树维护每个点被覆盖几次,然后双指针。
比较可惜的题......考场上大概按顺序想到:
每次都在集合中。- 一个点至多被用一次。
- 次数够用的时候,从小到大依次选择每一个和
操作是最优的。 - 猜想
的集合至多只有 个。
而且推出了变换的那个式子,如果观察每次集合大小
然后就能得到:肯定是对排序后的一个后缀操作,将这个后缀划分成若干区间依次合并。后来的
最后的正解比较神奇,但和我的猜想比较类似。
哈哈,
感觉提交答案题就是时间换分数,如果做到一定程度感觉瓶颈了,就赶紧去别的题吧(当然是在保证拿到所有弱智分之后)
06.28 : NOI2017 Day 1
期望:
。
实际:。
总结
笑拉了,要是
本场最难题
明显是拿个什么东西模拟进位。一开始的想法是开那么多个
很长一段时间明明脑子里想着线段树,但是一直在考虑加法的过程中均摊(甚至没意识到有减法!)。想了一年才发现如果只有加法那甚至不用线段树。但是如果有减法的话,二分找可以进位/借位的地方就比较明显了。
不知道为啥这种垃圾题会出现在 NOI!
感觉就算没算出来复杂度,写个没有脑子的暴力也能直接过啊!
显然每次接上两段的时候,把经过端点的长度不超过
尝试考虑一下以某一个点开头的区间个数,你发现只有
比想象的要简单一点!
首先恰好为
一开始以为只要对最低一层的情况
然后就在想,如果给定一张图,怎么算最大矩形面积。想法是直接对每列最低的障碍,建笛卡尔树一样的东西。那对递归进两边的时候,相当于递归进两个子问题,然后给两个子问题下面加一行。所以一个子问题状态可以看作
然后先设
然后
07.01 : NOI2017 Day 2
期望:
。
实际:。
总结
挂了整整
是之前讲课就讲过的题。x
的取值,而是可以给他分配成 a
,b
或 c
然后一起跑 a
还是 b
,就可以覆盖这个位置的三种取值了,非常神奇!
因为在考前被灌输了无数次“这是个模拟费用流”的思想,所以这题的难度直接减半 前一半是想到网络流。中途题意理解出现了问题,搞定题意之后,很快就想到了
优化到
8。
07.10 : NOI2018 Day 1
期望:
。
实际:。
简单的 记得不要写 SPFA 求最短路
比较可惜的题。
首先打表猜结论。首先看到 3 2 1
是不合法的,容易得知任意存在三个下标
然后这就是不存在一个长度为三的下降子序列。根据
考场上直接模拟
容易发现
可惜这个定义方式貌似难以支持此题所需要的限制,因为带有标号分配,所以字典序大小难以控制。
如果重新观察最长上升子序列的求法,注意到如果一个数是前缀最大值,那么一定被放在第一个序列;否则,他一定是“还没放好的最小元素”,否则后面这个元素就再也放不了了。于是可以设
与上面不同的是,这样设置后不涉及标号分配,容易满足字典序要求。于是,只需要枚举
当然,如果
感觉并不算特别困难。
建立
然后对于一个枚举的
然后就得到了一个
根据一般经验得知二分套线段树总是不优的 考虑优化掉二分的
但这还不够,因为这中间可能存在相同的子串被重复计算。“
(后来发现为什么要在
可能可以通过离线之类的方法把线段树合并维护
08.05 : NOI2018 Day 2
期望:
。
实际:。
鸽了快一个月
大概是要解决
X = 0, M = 1;
for(int i = 1, d, c1, c2, x1, x2, g; i <= n; ++i) {
d = (a[i] - v[i] * (X % p[i]) % p[i] + p[i]) % p[i];
c1 = v[i] * (M % p[i]) % p[i], c2 = p[i];
ExGcd(c1, c2, g, x1, x2);
if(d % g) return puts("-1"), void();
x1 = x1 * (d / g) % p[i];
X = X + x1 * M;
M = M / __gcd(p[i], M) * p[i];
X = (X % M + M) % M;
}
关键的问题是 M = M / __gcd(p[i], M) * p[i];
,这是默认所有方程都是
比较稳妥的方式是将其转化为
08.17 : NOI2019 Day 1
期望:
。
实际:。
极限模拟
以边为阶段转移,在每个点上挂一个队列表示以这个点作为结尾的边的凸壳。求答案的时候可以直接在凸壳上二分最接近要求斜率的点,也可以这样指针扫过去:
因为查询的斜率单调不降,所以用一个“单调队列”将斜率不再可能合法的点全弹出。直接用凸壳切线截距最小来理解看起来有点怪,主要是因为这会使得单调队列里留下一些“实际上不在全局凸壳上的点”,或者说会缺少当前区间凸壳的一些点。但是由于询问点单调,所以可以说明这些缺失的点不会对答案产生任何影响。
但是你如果用一些更不“本质”的角度去想,看起来会有道理一些:当直线的切点切换的时候,前面的点就再也没用了,所以可以直接删掉。
反正我是不知道哪里觉得有点怪
没做出来,比较可惜。
首先考虑最大值,如果有多个,先看最靠右的那个。这个点的位置应该“几乎在序列中点”,因为他向左向右都可以移动到端点。然后两侧就是两个子问题,注意左边的子问题中仍然可以填,和最大值相等的元素(因为这样的位置向右也跨不过当前这个点),即:
考虑
再看上面的转移,就会发现
然后推到
一开始编的费用流模型依靠一个结论,但是那个结论假了!!!后面写的费用流甚至跑不过
首先,可以看作是将
根据 cmd 的方法,只需要对特殊的费用流图,一一枚举增广路,并分析其现实意义,就可以得到若干种贪心转移。最后大概需要
08.18 : NOI2019 Day 2
期望:
。
实际:。
考虑到凑不出
极限翻盘!!!!!!
一个做法是直接数据结构优化建图,但是空间开不太下。直接的解决方案是,不把这些边建出来,每次都暴力在数据结构上松弛。
另外一个跑的飞快的做法是,按弹跳装置做点,然后跑点权 这个做法所有点的时间总和比前一种做法一个点还快
考前听说了这题是找规律题,然后就快速通过了!!!!
先写一个暴力,尝试看看样例每一项是多少。把取模的数字改回小数,观察发现
合理猜测
好像编的就是正解,但是不会处理单点,加上一些常数问题导致只有
查询次数
random_shuffle
一下,每次想必会找到很多的边!!!然后就可以用 check
来判断与一个点相连的边是不是都被标记了,及时把这样的点删掉就行。
但是我不太会处理单点,他们会让这个过程无法结束,且会增大操作常数。所以我的做法中一开始需要 check
来先删掉所有单点。后面修完了再回来补!!!