AtCoder Beginner Contest 263 G,Ex
G
如果我们不考虑的情况,即不存在这样的数对,那么剩下的质数都是奇数,而奇数+偶数=奇数。所以,若我们从连一条边到,当且仅当是质数,那么最后形成的图一定是二分图,(所有为奇数的在一侧,所有为偶数的在另一侧)跑网络流就可以了。(注意这里同一类数不止一个,所以连向和连向的边流量限制为而不是)
那么现在如果有一个,满足,我们假设当前它自己和自己匹配了对(),那么将剩下的加入网络流中,假设当前最大流为,那么我们总共匹配了个数对。我们证明,是单峰的。
感性理解:
假设我们从的点向对面连去一些边,那么最优方案中这些边有的被选择了,有的没有。那么我们一开始肯定将没有匹配的(剩下的),自己和自己匹配,这样能使答案加上;直到最后我们就会选择一些已经考虑的配对,那么此时我们要将两个已经配对的边拆散,组成一个新的配对的边——比如原本我们匹配了和两个数对,那么我们现在拆散它们,组成这样新的一个,容易发现,这样会使答案减少。故我们这个函数一定是一直向上升,到某个最高点后开始向下降。
那么我们三分,计算时的值即可。
https://atcoder.jp/contests/abc263/submissions/33863883
Ex
不难想到要先二分答案,之后问题转化成求有多少个交点在半径为的圆内部。
发现一个结论:
在任意一处破环成链,将所有直线和圆的交点按照顺时针顺序离散化。如果离散化后,直线和圆的交点位置为,和圆的交点为。那么和的交点在圆的内部,当且仅当。
这样我们可以用线段树统计,具体实现见代码:
https://atcoder.jp/contests/abc263/submissions/33884586
说一点细节(这些细节让我调了很久):
- 实数二分尽量采用迭代若干次的方法,不要用while,否则eps设的太低容易死循环。
- 发现答案最大值不会超过,所以二分上界可以开小一点。
- 答案对精度要求不是很高,那么我们可以降低迭代次数优化时间复杂度。(计算几何常数是真的大)
- 记得count每次要清空所有的数组!
- 由于每个点与圆有两个交点,那么线段树的空间不能只开到maxn的四倍,要开到8倍!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话