跳转至

260106 模拟赛

T1

你需要在一张 \((n+1)\times (m+1)\) 的棋盘上放置一些车,满足:

  • 最外面一圈格子不能放;
  • 其中一些格子有障碍物,车不能放在障碍物上;
  • 不能有两个车能相互攻击到,障碍物不影响攻击;

保证 \(n,m\ge 1\)。有一个卒初始在棋盘的第一行,卒只能向左右或者下三个方向移动。称一个格子是安全的当且仅当它可以被某一辆车控制。你需要使得卒不能仅通过安全的格子(也不能和车在一个格子)到达第 \(n+1\) 行。求方案数。

\(n,m\le 3000\)

我没看到一行一列不能有两个车,看到之后恍然大悟。最后 3min AC。

手模一下发现,有以下充要条件:所有棋子必须形成一条上升链或者下降链;若两个棋子在相邻两行,那么它们必须在相邻两列,反之亦然。于是直接 dp 即可。

T2

给定一个序列和常数 \(k\),有 \(q\) 次询问,每次询问查询一个区间有多少个有序二元组 \((i,j)\) 满足 \(a_i+a_j\le k\)。强制在线。

\(n,q\le 2\times 10^5\)

\(O(n\sqrt n\log n)\)\(O(n^2)\) 一个分。。。

注意到有一道题叫做 Yuno love sqrt tecnology I,强制在线区间逆序对,跟这道题一样。这是一种将莫队二次离线在线化的科技。注意到莫队二次离线本质上就是用数据结构维护插入删除,而数据结构就是用来高效处理贡献的。这种方法本质上就是在线处理了区间内所有二元组的贡献。

考虑分块,先预处理块内贡献(排个序然后扫一遍),然后预处理每个块和序列中的每个数之间的贡献(这里 \(O(n\sqrt n)\)),然后就可以知道两个块之间的贡献,然后可以 \(O(n\sqrt n)\) 求出一个区间的块的总贡献。

然后处理散块贡献。可以维护整块一个前缀对一个散块的贡献,然后直接差分做完了。题解的做法是维护每个块向一个块内的前缀的贡献(当然另一侧需要维护对应的后缀贡献),也可以 \(O(\sqrt n)\) 做出来。