CSP/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。

  • AT_abc426_d

分全变成 \(0\) 和全变成 \(1\) 两种情况考虑。

下面只考虑变成 \(0\) 的情况。

一个比较显然的结论:从两边开始操作,如果是 \(0\) 则需要操作两次, \(1\) 需要操作一次。

要使操作数尽可能小,就要让中间的 \(0\) 连续段尽可能长,所以枚举出最长连续段,然后两边计算操作数即可。

  • P14253

如果一个小区间被一个大区间包含且左端点相同,那么这个小区间一定不比大区间更优。

所以考虑枚举左端点 \(L\),判断区间 \([L,n]\)\(0\) 的个数。

具体做法是对 \(a\) 数组做一遍前缀和,然后用 \(map\) 维护每一个值出现的次数,左端点向右移动的时候在 \(map\) 中查找对应的值的个数。

  • P1938

N 题。

  • P4588

对于操作一建一棵线段树,初始值全是 \(1\)

操作一和二就是单点修改,注意 long long 和取模。

  • P8271

神秘思维题。

自然是要考虑 \(O\),\(W\) 两个字母,发现对于 \(OW\)\(WO\) 能变为 \(C\),自然两个相邻字母可以交换位置,也就是任意两个字母可以调换顺序。

于是把 \(O,W\) 尽可能多地变成 \(C\),然后剩下的两两删除,根据奇偶性判断是否只剩下一个 \(C\)

  • P4513

线段树维护最大子段和。

对于每一个节点,要维护区间和,区间最大子段和,最大前缀和,最大后缀和。

  • P3384

树剖。

一些定义:

一个节点的子树大小最大的子节点是这个节点的重儿子,其余的为轻儿子。

连接两个重儿子的边是重边,其余的为轻边。

重链是又重边构成的一条链,其顶端为轻儿子。

首先先预处理出子树大小,重儿子,深度,dfs 序,该节点所在重链的链顶的节点编号。

因为预处理的时候先搜重儿子,所以重链上的点的 dfs 序是连续的,于是如果要修改/查询一条路径就可以让两个端点先跳到一条重链上,这个时候深度小的点是这两个点的 LCA,在这个过程中用线段树维护区间修改/查询。

修改/查询子树是容易的,因为一个子树内的点的 dfs 序是连续的,所以可以在 dfs 序上区间修改/查询。

  • P3038

树剖。

将边权转化为点权,让这条边所连接的深度较大的点的点权赋为这条边的边权,如果选择深度较小的点的话这个点可能会对应很多不同的边权,而这里的映射必须是一一对应的。

  • P4427

边权转点权。

发现 \(k\) 很小,所以预处理出来所有的从根节点到 \(u\)\(k\) 次方和。

  • P6098

树剖。

  • P2824

二分答案,让 \(\ge mid\) 的数的值为 \(1\),剩下的为 \(0\) ,然后建一颗树统计一的个数,升序就先区间赋 \(0\) 再赋 \(1\),降序与之相反。

复杂度是 \(O(n \log^2 n)\) 的。

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