Atcoder Beginner Contest 246 解题报告
A Four Points
题目大意
给定矩形的三个顶点,求其剩下的顶点。
思路
签到
B Get Closer
题目大意
给定直线过点 , ,求从 出发,方向朝右,长度为一的线段的右端点。
思路
一开始是二分硬做的,然后被卡精度了。
求出两点距离,对 分别除于这个这个距离即可。
给定矩形的三个顶点,求其剩下的顶点。
签到
给定直线过点 , ,求从 出发,方向朝右,长度为一的线段的右端点。
一开始是二分硬做的,然后被卡精度了。
求出两点距离,对 分别除于这个这个距离即可。
给定 个长度为 ,字符集为 a-x 的字符串。
对于 s, s \subseteq \[ \texttt{a}, \texttt{x} \],有 表示有多少个给定字符串和 交集非空。
输出
注意到基本上是 SOS DP 的模版,除一个问题 -- 对于一个字符串可能会被统计多次。
简单容斥即可。
为什么没在标题里写 SOS DP ?因为这 SOS 这个名字我第一次看的时候怎么看怎么觉得不正经,所以写全称让他看着正经一些。
个人感觉这个东西更像是一个套路而不是 DP 类型。
Sum over Subsets DP,即求子集和的 DP。更具体的说,用于在 的时间求出以下式子:
给定一个长度为 的序列
求最大 满足
先考虑 ,显然可以通过 SOS DP 来求出对于任意 ,其最靠后 的能够有 使得 的位置。
然后考虑贪心来最大化按位或,从高位往低位处理,如果能够有一位新为 ,则有限选择位数高的。
给定一个长度为 的序列 。
对于每一个 ,询问是否存在 使得 ,如果有输出 (如果有多个,输出任意一个),否则输出 。
。
注意到 ,其实就是询问是否有数字满足其是 的补集的子集。
SOS DP 求出每个集合是否有数字是其子集即可。