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。

posted @ 2025-10-04 20:41  infinite2021  阅读(17)  评论(0)    收藏  举报