NOIP之前的复健记录
写一些做题记录,题解和随机话。
看样子月考至少得有一个比较好看的成绩。
这回真是高一零基础学OI/文化课了。
- CF547B
考虑每一个数对答案的贡献。
自然是当这个数 \(a_i\)是所选的区间最小值时对答案有贡献,所以我们找到左边第一个比 \(a_i\) 大的数 \(a_l\) 和右边第一个比 \(a_i\) 大的数 \(b_i\),那么这个以 \(a_i\) 为最小值的区间长度最大是 \(r-1-(l+1)+1=r-l-1\)。
要求每一个长度 \(k\) 的区间的答案,发现一个长度为 \(len\) 的区间的答案同样对 \(k = [1,len-1]\) 的答案有贡献。类似差分的做法,对 \(ans\) 数组的 \(ans[len]\) 与当前答案取 max,然后做一遍后缀 max 即可。
求左/右边第一个比当前数大的数用单调栈来做,然后复杂度是线性的。
- AT_abc352_d
黄题都不会,退役吧。
考虑定义 \(a_i\) 表示 \(i\) 在原序列中出现的位置。
那么我们枚举所有的连续 \(k\) 个整数,发现答案是 \(a_i\) 的最大值减去 \(a_i\) 的最小值。
最大值减最小值做两遍滑动窗口即可,然后取 min。
- P7473
直接对所有可以到达的点之间连边是 \(n^4\) 的,空间和时间都难以接受。
发现在操作过程中,这两个位置都挨着边界或障碍物,于是我们只把挨着边界或障碍物的点进行连边,然后反向跑 bfs。
具体实现是先给所有需要建边的点编号,对于所有需要建边的点,先预处理出它四个方向所能到的点的编号,然后反向连边。
bfs 的队列是一个 pair,表示两个位置的编号,然后 \(dist_{i,j}\) 表示从编号 \(i\) 到编号 \(j\) 的操作数,初始化正无穷,\(dist_{i,i}=0\)。
计算答案首先要先把初始的位置给变成两个有编号的位置,即让这两个位置进行一次操作让它们都挨着边界或障碍物,然后对四个方向取 min。