HNOI 2018 Day2 题解

Luogu4436 [HNOI/AHOI2018]游戏

一次小 G 和小 H 在玩寻宝游戏,有 \(n\) 个房间排成一列,编号为 \(1,2,\cdots,n\) ,相邻的房间之间都有一道门。其中一部分门上锁(因此需要有对应的钥匙才能开门),其余的门都能直接打开。现在小 G 告诉了小 H 每把锁的钥匙在哪个房间里(每把锁有且只有一把钥匙与之对应),并作出 \(p\) 次指示:第 \(i\) 次让小 H 从第 \(S_i\) 个房间出发到 \(T_i\) 个房间里。但是小 G 有时会故意在指令中放入死路,而小 H 也不想浪费多余的体力去尝试,于是想事先调查清楚每次的指令是否会存在一条通路。

你是否能为小 H 作出解答呢?

\(1\le n,p\le 10^6\)\(0\le m <n\)\(1\le x,y,S_i,T_i<n\) 保证 \(x\) 不重复。


  暴力

  比较正确的方法:https://www.cnblogs.com/C202044zxy/p/15815703.html

  但是,这题可以暴力地艹过去。

  记每个点最远走到的点 \((L_i, R_i)\),然后每次暴力拓展,然后加个记忆化,据 Loj2397.「JOISC 2017 Day 3」幽深府邸 的官方题解说复杂度正确,为 \(\mathcal O(n\log n)\)不会证明。

  没想到是个双倍经验题

Luogu4437 [HNOI/AHOI2018]排列

给定 \(n\) 个整数 \(a_1, a_2, \dots, a_n, 0 \le a_i \le n\),以及 \(n\) 个整数 \(w_1, w_2, \dots, w_n\)

\(a_1, a_2, \dots, a_n\) 的 一个排列 \(a_{p[1]}, a_{p[2]}, \dots, a_{p[n]}\)\(a_1, a_2, \dots, a_n\) 的一个合法排列,当且仅当该排列满足:对于任意 的 \(k\) 和任意的 \(j\),如果 \(j \le k\),那么 \(a_{p[j]}\) 不等于 \(p[k]\)。(换句话说就是:对于任意的 \(k\) 和任意的 \(j\),如果 \(p[k]\) 等于 \(ap[j]\),那么 \(k<j\)。)定义这个合法排列的权值为 \(w_{p[1]} + 2w_{p[2]} + \dots + nw_{p[n]}\)

你需要求出在所有合法排列中的最大权值。如果不存在合法排列,输出 \(-1\)

\(n \le 5\times 10^5\)


  贪心

  完了,基本贪心模型想了半天想不起来了,感觉最近要练习贪心技巧了。

  题面过于鬼畜,看了半天。

  为了方便思考,我们可以先 \(i \to p_i\) 连边,\(1 \sim n\) 依次考虑选择 \(p_i\),那么当且仅当 \(a_{p_i}\) 已经有入边(或者为 \(0\)),这条边才是合法的。

  这个限制就是:

对于任意 \(k\)\(a_{k}\) 一定比 \(k\) 先选(假设我们第一个选的数是 \(0\))。

  于是我们可以将序列的关系转化成图的形式,对于每个 \(i\),有边 \(a_i \to i\),然后每选一个点,它的所有出边就都可以选择了,然后,如果整个图存在一个环,那么就不能选完,于是无解,最后这个图是一棵树的结构,选择一个点,必须先选其父亲。

我没有任何问题地推到了这里,于是直接敲了一个很假的贪心上去,得了 \(20\) 分,然后发现这个转化后的问题是一个比较经典的问题,再推了半年,还是不太会,然后只会优化一下判 \(-1\) 的条件,得了 \(30\) 分。

要是我梦回 \(\tt HNOI2018\),我应该直接寄了。

  不扯了,但是之后确实是一个经典问题。

  我们可以对于整个点维护一个序列,表示选了这个点之后的选择排列情况,然后每次选择的时候,该点合并到父亲所在的序列中,使得产生的贡献最大。我们用 \((siz, tot)\) 表示一个序列的长度和权值和,考虑两个序列,\((siz_1, tot_1)\)\((siz_2, tot_2)\),那么 \(1\) 先于 \(2\) 选择的条件是:

\[siz_1tot_2 > siz_2tot_1 \]

  然后可以用并查集维护每个点当前所在的序列位置,使用堆进行贪心选择了。

  代码

Luogu4438 [HNOI/AHOI2018]道路

  贡献提前计算板子题,不写了。

posted @ 2022-01-18 17:38  Werner_Yin  阅读(77)  评论(2编辑  收藏  举报