Codeforces Round #678 (Div.2)
A. Reorder
1 |
|
B. Prime Square
形如
即可。
1 |
|
C. Binary Search
根据题目给的代码走,当当前区间中点为 $mid$ 时,为了满足最后能找到 $pos$ 处,要求:
- 如果 $mid \leqslant pos$,则需要执行
l=mid+1
,因此要求 $mid$ 处的值 $\leqslant x$; - 否则 $mid>pos$,则需要执行
r=mid
,因此要求 $mid$ 处的值 $>x$。
设要求小于 $x$ 的数有 $a$ 个,要求大于 $x$ 的数有 $b$ 个,则答案为 $A_{x-1}^a\times A_{n-x}^b\times (n-a-b-1)!$.
1 |
|
D. Bandit in a City
二分答案,$mid$ 表示叶节点最多容纳的人数,check 是否能够满足该条件。
设 $sum[x]$ 表示以 $x$ 为根的子树中 $a_i$ 的和,$cnt[x]$ 表示以 $x$ 为根的子树的叶节点数量,则 $cnt[x]\times mid$ 表示当前二分的答案下子树 $x$ 能容纳的最多人数。结论是当且仅当
时满足 check 条件,可以自下向上数学归纳证明。
1 |
|
E. Complicated Computations
$x$ 不是答案 $\iff$ 存在一个不包含 $x$ 的区间包含了 $1\sim x-1$。
于是我们只需要考虑 $x$ 两次出现之间包夹的区间,如果这里面的数字种数为 $x-1$,那么 $x$ 不是答案。
所有这样的区间是 $O(n)$ 的,所以只需要 $O(\lg n)$ 地查询即可。
我们开一颗线段树,以数值为值域,在从左往右扫描的过程中存储该数值最近一次的编号(即一个存储最近一次编号的桶)。当加入数字 $a[i]$ 时,查询 $1\sim a[i]-1$ 这些桶内的最小编号 $l$,如果 $l$ 大于 $a[i]$ 上一次出现的位置,则说明从 $a[i]$ 上一次出现到当前出现这一段区间内,$1\sim a[i]-1$ 全部出现了,于是 $a[i]$ 不是答案。
1 |
|
Codeforces Round #678 (Div.2)
http://xyfjason.github.io/blog-xcpc/2021/06/11/Codeforces-Round-678-Div-2/