7.16 模拟赛
7.16 模拟赛
T1. park
Description
$n\le 10^6$
1s 512MB
Solution
优先队列模拟。复杂度 $O(n\log n)$。
由于题目的特殊性,取值最多只有 $O(\log n)$ 个,大概可以 $O(n)$。
第一次指导优先队列的常数比 set 小很多。
Code
1 |
|
T2. monster
Description
$n\le 10^5,a,b\le 10^9$
1s 512MB
Solution
感觉很妙的一道题。
假设我们以此打了$(a_{p1},b_{p2}),(a_{p1},b_{p2}),(a_{p3},b_{p3}),…(a_{pn},b_{pn})$。初始血量为任意时刻血量最小值的相反数。
因此目标最大化 $\min\sum\limits_{j=1}^{i-1}(b_{pj}-a_{pj})-a_{i}$。假如先打 $(a_i,b_i)$,再打 $(a_j,b_j)$,根据最大化原则,我们可以合并两个点:
- 若 $a_i<a_i-b_i+a_j$,则合并为 $(a_i-b_i+a_j,b_j) $
- 若 $a_i\ge a_i-b_i+a_j$,则合并为 $(a_i,b_i-a_j+b_j)$
之后考虑选择进攻点的顺序,对于 $(a_i,b_i)$ 和 $(a_j,b_j)$:
- 如果 $a_i\le b_i$ ,$a_j\ge b_j$ ,则优先 $i$
- 如果 $a_i\le b_i,a_j\le b_j$,则优先 $a$ 小的
- 如果 $a_i\le b_i,a_j\le b_j$ ,则优先 $b$ 大的
考虑用优先队列维护这个关系。
在树结构中,假设已经知道了 $x$ 的儿子 $y_1,y_2,…,y_k$ 的攻击序列,且儿子的攻击序列均已有序。
那么显然,$x$ 只需要把所有的攻击序列归并一下就完事了。
但是,此时需要在序列的最开头加入 $x$,可能会破坏原来的顺序。则 $x$ 依次合并比其小的点。说明攻击完 $x$ 后,马上攻击比 $x$ 还要优的怪。
写法上,启发式合并是 $O(n\log ^2n)$,可并堆是 $O(n\log n)$。下面代码实现的第一种。
Code
1 |
|
T3. monster
Description
P8511
Solution
观察到样例相同的答案很多。我们事先用 01trie 求出全局异或最大的点对 $x,y$。除了子树中包含 $x$ 或者 $y$ ,其余答案皆为这个最大值。具体的,就是 $x$ 和 $y$ 的祖先。这里是 $O(n\log w)$ 的。
之后只需要从根到 $x$ 依次暴力加入 $x$ 的祖先,求答案即可。$y$ 同理。这里同样是 $O(n\log w)$ 的。
Code
1 |
|
Hint
不要左移 $63$ 位,会爆 long long!!!
T4. boxing
Description
$n\le 9,k\le 16,k\le n$
1s 512MB
Solution
dp 套 dp
先不考虑 $k$ 的限制。不妨先将 $m_i$ 个选手升序排序。令 $f[i][j]$ 表示前 $i$ 个选手,位置状态为 $j$ 。根据每个人选或者不选,排列一下。
考虑 LIS 的限制,有一个经典套路就是维护 $[1,i]$ (不一定以 $i$ 结尾)的最长上升子序列长度 ,差分一下,显然所有的值只有 $0,1$。维护的时候,按权值从小到大加入,加入第 $i$ 个位置的数时,只需要将第 $i$ 个点的位置改为 $1$ ,之后的第一个 $1$ 改为 $0$ ,如果后面没有 $1$ 则不修改。
这里的转移可以预处理。复杂度 $O(nm2^n\cdot 2^n)$ 。
令位置的状态 $S$, LIS 的状态 $T\subseteq S$,所以复杂度可以变为 $O(nm3^n)$
Code
1 |
|