YNOI 做题记

ynoi,题记 · 浏览次数 : 2

小编点评

**问题:** 给定一个包含 \\(n\\) 个点,其中点坐标为 \\((i, p_i)\\),其类型为 \\(c_i \\in [1, n]\\),每个类型有一个权值 \\(w_i\\)。其中 \\(p\\) 是一个排列,多次询问求矩形中所有存在类型的权值之和。 请问如何使用莫队或二分块来实现该问题?

正文

YNOI 做题记

偶然有一天做到了其中的一道题,于是便开始做相关的题了……

[Ynoi2015] 我回来了 - 洛谷

这之一场联考搬过来的题……于是考场上写了一个 \(O((n + m)\log^2 n)\) 的代码,然后成功被卡掉,非常慢速。

其实离线,将每一个伤害答案变化的时间做出来,然后加入时间序列后,树状数组维护即可。

其实发现如果询问很多,但是序列没有询问长,很可能考虑离线。

[Ynoi2010] y-fast trie - 洛谷

\(\mathrm{FaKe}\) y-fast trie……

其实有很 naive 的想法就是维护单向的最优。但是很明显,一次修改可能影响到 \(O(n)\) 个关系,所以单向显然是不好的。

其实维护双向最优,因为单向的一定不是最优的,所以完全可以缩减答案候选范围。于是一次修改最多影响到 \(O(1)\) 个关系,显然很优秀,所以小小的用 set 维护即可。

只是很难写,真的可以直接维护边吗?

显然很麻烦,所以需要每次动态的查询双向关系。

[Ynoi2016] 镜中的昆虫 - 洛谷

区间赋值,区间数颜色?\(\mathrm{ODT}\) 的复杂度真的很对!

先有单点修改,区间数颜色,依据套路,维护 \(pre\) 即可,发现每次修改会影响 \(O(1)\)\(pre\),所以分块维护 \(pre\) 即可。

但是区间?对于信息的重复修改显然是不优的,所以有结论区间赋值对于 \(pre\) 的影响是 \(O(n + m)\) 的。

因为区间中的 \(pre\) 显然有 \(pre_i = i - 1\)。所以会影响到的其实只有颜色段的两端。

由于每次至多增加 \(4\) 个端点(认为 \(O(1)\)),原本有 \(O(n)\) 个端点,所以最多会影响到 \(O(n + m)\) 个端点,也就是影响 \(O(n + m)\)\(pre_i\)

但是,\(\mathrm{ODT}\) 之所以不用合并相同的节点,其实在于是随机数据,还有也就是本题的 \(O(n + m)\) 的性质吧。

然后 \(Luogu ~ \mathrm {RK4~?}\)

[Ynoi2016] 掉进兔子洞 - 洛谷

好厉害的想法!

每一个区间出现了那些数是好记的,但是合起来就不知道出现的多少次了。

离散化怎么离散化呢?可以记第 \(k\) 个出现的 \(x\)\(x + k - 1\)。于是就可以了?

所以没有 unique 的离散化和 bitset 套莫队!

inline void add(int x) {
	cur[x + ++cnt[x] - 1] = true;
}

inline void del(int x) {
	cur[x + --cnt[x]] = false;
}

但是为了规避出现 \(l > r\) 的情况,在莫队转移的时候需要先向外扩展,再向内缩。

while (r < q.r) add(a[++r]);
while (l > q.l) add(a[--l]);
while (r > q.r) del(a[r--]);
while (l < q.l) del(a[l++]);

这是必要的(否则在 adddel 中需要特判 \(> 0\),但是这会很慢)。

所以说 bitset 套莫队这个套路还是十分套路的(废话)

[Ynoi2007] rcn / [Ynoi2003] 博丽灵梦 - 洛谷

这道题没了……在 \(Luogu\) 上看不了,\(LibreOJ\) 上也没有。

题意是有 \(n\) 个点,坐标为 \((i, p_i)\),其类型为 \(c_i \in [1, n]\),每一个类型有一个权值 \(w_i\)

其中 \(p\) 是一个排列,多次询问求矩形中所有存在类型的权值之和。

这,上二维数颜色了啊……可是排列!发现如果莫队移动每一次就只会修改一个点,也就是说只会影响 \(O(1)\)\(pre\),所以可以分块维护 \(pre\),但是需要 \(O(1)\) 修改,\(O(\sqrt n)\) 查询。

发现加入不好维护,所以利用不增莫队,只是删除。

问题在于分块如何 \(O(1)\) 修改,\(O(\sqrt n)\) 查询。这本质上是一个二维数点问题,所以可以二维分块,可以参考 [Ynoi2007] rdiq - 洛谷,属于是二维分块板板了(可是二离常数更小!)

还是太弱了,只会 \(O(\sqrt n)\) 修改,以及 \(O(\sqrt n \log n)\) 查询,如果是这样,套莫队就变成了 \(O(n \sqrt n \times \sqrt n + m \sqrt n \log n)\),这复杂度看着都抽象 QwQ

其实本题好像就是 [Ynoi2003] 博丽灵梦 - 洛谷,问题不大,慢慢做吧这。

与YNOI 做题记相似的内容: