$Div.1$
A Marcin and Training Camp
有 $n$ 个人,每个人有一个集合,用二进制数 $a_i$ 表示,以及一个能力值 $b_i$ .
现在需要选出一些人形成一个大小 $\ge 2$ 的集合 $S$ ,满足 $\forall i\in S,\exists j\not=i,a_i \& a_j=a_i$ .
需要求出最大的 $\sum_{i\in S}b_i$ ,无解输出 $0$ .
容易发现,选出的人中至少有两个人的 $a_i$ 是相同的,即形成自环.否则就会存在拓扑序,至少存在一个不合法的元素.
可以先将有相同的元素都选上.
对于其他元素,只需要判一下能否被那些有相同的元素限制,即找到 $a_i \& a_j=a_i$ 的 $j$ ,内部不需要判断.
这是因为 $a_i \& a_j=a_i$ 这个关系是可以传递的.
1 |
|
B Kamil and Making a Stream
给一棵以 $1$ 为根的有根树,每个点有一个权值 $x_i$ .
设 $f(x,y)$ 表示从 $x$ 到 $y$ 的路径上所有权值的 $\gcd$ .
需要求出$\sum_{\text {u is an ancestor of v}} f(v,u)$ ,答案对 $10^9+7$ 取模.
一个点到根的路径上,不同的 $\gcd$ 最多只有 $\log x$ 种,因为 $\gcd$ 每次改变时至少会 $/2$ .
于是倍增处理每个点向上跳 $2^i$ 步这段的 $\gcd$ 进行处理.
或者 $dfs$ 时直接把 $\gcd$ 的 $vector$ 数组传下来,相同的数合并,只记录次数.
1 |
|
C Konrad and Company Evaluation
有 $n$ 个人,每个人有一个工资,初始时等于他的编号.
给出一张图,对于一条边 $(u,v)$ ,若 $u$ 的工资比 $v$ 高,则从 $u$ 连向 $v$ ,否则从 $v$ 连向 $u$ .
有 $q$ 次询问,第 $i$ 次询问给出一个 $x$ ,表示将第 $x$ 个人的工资改为 $n+i$ ,再求出图中长度为 $3$ 的链的数目.
将 $a$ 向 $b$ 炫耀看成一条有向边 $a\to b$ .
记录每个点的入度 $indeg_i$ 和出度 $outdeg_i$ ,答案为 $\sum_i indeg_i\cdot outdeg_i$ .
每次将 $v$ 的工资调到最大,就是将所有 $u\to v$ 的边全部反向.
只要将这些边一条条的暴力反向的同时维护答案就可以了.
通过一些势能分析,可以得出每次修改时均摊反向 $O(\sqrt m)$ 条边.
时间复杂度 $O(n+m+q\cdot \sqrt m)$ .
1 |
|
D Wojtek and Card Tricks
给出 $n$ 个长度为 $k$ 的置换, $n\le 2\times 10^5,k\le 5$ .
定义 $f(l,r)$ 表示只用第 $l$ 个到第 $r$ 个置换对排列 $1,2,3,\dots,k$ 进行若干次操作,最多能得到的排列的数目.
需要求出 $\sum_{l=1}^n \sum_{r=l}^n f(l,r)$ .
对于每个左端点 $l$ ,先预处理出从 $l$ 向后走,哪些置换是第一次出现的,这可以从后往前扫一遍完成.
枚举左端点 $l$ ,只用考虑从 $l$ 开始第一次出现的置换,最多只有 $k!$ 个,其它地方答案不变,可以直接计算.
加入一个新的置换时,如果它能被已经加入的置换组合出,就没有用,直接跳过.
否则,直接大力 $bfs$ 出所有已经加入的有用的置换能操作出的排列,若答案改变,说明这个排列有用.
状态数最多为 $k!$ ,而有用的置换不会超过 $O(\log k!)$ 个,所以每加入一个有用的置换复杂度为 $O(k!\log k!)$ .
时间复杂度 $O((k!)^2+nk!k)$ .
常数没卡过去,不想卡了.
1 | //%std |