Atcoder Beginner Contest 246 解题报告

发布于 # algorithm

A Four Points

题目大意

给定矩形的三个顶点,求其剩下的顶点。

思路

签到

B Get Closer

题目大意

给定直线过点 (0,0)(0,0), (a,b)(a,b),求从 (0,0)(0,0) 出发,方向朝右,长度为一的线段的右端点。

思路

一开始是二分硬做的,然后被卡精度了。

求出两点距离,对 a,ba,b 分别除于这个这个距离即可。

Codeforces 383E Vowels

发布于 # algorithm

题目链接:https://codeforces.com/contest/383/problem/E

1 题目大意

给定 nn 个长度为 33,字符集为 a-x 的字符串。

对于 s, s \subseteq \[ \texttt{a}, \texttt{x} \],有 f(s)f(s) 表示有多少个给定字符串和 ss 交集非空。

输出 sf(s)\*f(s)\sum^{\oplus}_s f(s) \* f(s)

2 思路

注意到基本上是 SOS DP 的模版,除一个问题 -- 对于一个字符串可能会被统计多次。

简单容斥即可。

Sum over Subsets DP 入门

发布于 # algorithm

0 引

为什么没在标题里写 SOS DP ?因为这 SOS 这个名字我第一次看的时候怎么看怎么觉得不正经,所以写全称让他看着正经一些。

个人感觉这个东西更像是一个套路而不是 DP 类型。

1 什么是 SOS DP

Sum over Subsets DP,即求子集和的 DP。更具体的说,用于在 O(k2k)O(k \cdot 2^k) 的时间求出以下式子:

fmask=imaskaif_{mask} = \sum_{i \subseteq mask} a_i

Codeforces 1208F Bits And Pieces

发布于 # algorithm

题目链接:https://codeforces.com/contest/1208/problem/F

1 题目大意

给定一个长度为 nn 的序列 aa

求最大 ai(aj&ak)a_i|(a_j\&a_k) 满足 i<j<ki < j < k

3n106,0ai21063 \leq n \leq 10^6, 0 \leq a_i \leq 2 \cdot 10^6

2 思路

先考虑 aj&aka_j\&a_k,显然可以通过 SOS DP 来求出对于任意 ss,其最靠后 jj 的能够有 kk 使得 saj&aks \subseteq a_j\&a_k 的位置。

然后考虑贪心来最大化按位或,从高位往低位处理,如果能够有一位新为 11,则有限选择位数高的。

Codeforces 165E Compatible Numbers

发布于 # algorithm

题目链接:https://codeforces.com/contest/165/problem/E

1 题目大意

给定一个长度为 nn 的序列 aa

对于每一个 aia_i,询问是否存在 aja_j 使得 ai&aj=0a_i \& a_j = 0,如果有输出 aja_j(如果有多个,输出任意一个),否则输出 1-1

1n106,1ai41061 \leq n \leq 10^6, 1 \leq a_i \leq 4\cdot 10^6

2 思路

注意到 ai&aj=0a_i \& a_j = 0,其实就是询问是否有数字满足其是 aia_i 的补集的子集。

SOS DP 求出每个集合是否有数字是其子集即可。

Woshiluo's NoteBook

「Jump up HIGH!!」