Solution - Atcoder ABC263G Erasing Prime Pairs

news/2024/10/24 8:19:48/文章来源:https://www.cnblogs.com/rizynvu/p/18498740

\(a_i\) 和质数看着并没有很特殊,于是一些贪心或者是 DP 的大抵是做不了的。

于是一个想法是对于 \(a_i + a_j = p(p\in \mathbf{P})\)\((i, j)\) 连边,然后跑网络流。
但是需要确定的是这个建出来的图能不能拿来跑。

能够发现的是对 \(p\in \mathbf{P}, p\not = 2\),都满足 \(p\bmod 2 = 1\),这说明这些和为 \(p\) 的连边都是由 \(a_i\bmod 2 = 0\)\(a_i\bmod 2 = 1\) 连上的,那么显然为一个二分图。

于是就可以建图了。
对于 \(a_i\bmod 2 = 1\),连边 \((\operatorname{S}, i, b_i)\);对于 \(a_i\bmod 2 = 0\),连边 \((i, \operatorname{T}, b_i)\)
对于 \(a_i\bmod 2 = 1, a_j\bmod 2 = 0, a_i + a_j= p(p\in \mathbf{P})\),连边 \((i, j, \operatorname{inf})\)

注意到其实还有 \(p = 2\) 的特殊情况。
但时发现此时只有可能是 \((1, 1)\)
于是可以最后跑完看下 \(1\) 还有多少流量没用,就可以计算了(因为用 \(1\)\(1\) 显然比 \(2\)\(1\) 优)。

但是一个问题是如果直接最大流可能会导致没有先去配对 \((a_i, a_j)(a_i\not = 1)\) 而是去配对了 \((1, a_j)\)
这可能导致 \(1\) 剩余流量变少而使答案变小。

于是可以先不把 \(1\) 加入图中跑一次最大流,此时就已经保证了非 \(1\) 的奇数已经尽量匹配完了。
然后再加入 \(1\),再跑一次最大流,让 \(1\) 去匹配。
最后再统计流量即可。

时间复杂度 \(\mathcal{O}(V + \operatorname{flow}(n, n^2))\)

#include<bits/stdc++.h>
using ll = long long;
constexpr ll inf = 1e18;
int N, S, T;
namespace flow {static const int maxn = 1e2 + 10, maxm = 2e4 + 10;ll val[maxm * 2];int to[maxm * 2], nxt[maxm * 2], fir[maxn], tot = 1;inline void add(int x, int y, ll w, bool f = 1) {to[++tot] = y, val[tot] = w, nxt[tot] = fir[x], fir[x] = tot;if (f) add(y, x, 0, 0);}int hd[maxn], dep[maxn];inline bool bfs() {for (int i = 1; i <= N; i++)hd[i] = fir[i], dep[i] = -1;dep[S] = 0;std::queue<int> Q; Q.push(S);while (! Q.empty()) {int u = Q.front(); Q.pop();if (u == T) return true;for (int i = hd[u]; i; i = nxt[i])if (dep[to[i]] == -1 && val[i])dep[to[i]] = dep[u] + 1, Q.push(to[i]);}return false;}inline ll dfs(int u, ll fl) {if (u == T) {return fl;}ll ud = 0;for (int &i = hd[u]; i; i = nxt[i])if (dep[u] + 1 == dep[to[i]] && val[i]) {ll k = dfs(to[i], std::min(fl - ud, val[i]));if (! k) dep[to[i]] = -1;ud += k, val[i] -= k, val[i ^ 1] += k;if (ud == fl)return fl;}return ud;}inline ll Dinic() {ll ans = 0, f;while (bfs()) {while ((f = dfs(S, inf)) > 0) {ans += f;}}return ans;}
};
const int maxn = 1e2 + 10, maxV = 2e7 + 10, V = 2e7;
std::bitset<maxV> f;
int n;
int a[maxn], b[maxn];
int main() {for (int i = 2; i <= V; i++) {if (! f[i]) {for (int j = i + i; j <= V; j += i) {f[j] = 1;}}}scanf("%d", &n);for (int i = 1; i <= n; i++) {scanf("%d%d", &a[i], &b[i]);}S = n + 1, N = T = n + 2;for (int i = 1; i <= n; i++) {if (a[i] == 1) continue;if (a[i] & 1) {flow::add(S, i, b[i]);} else {flow::add(i, T, b[i]);}}for (int i = 1; i <= n; i++) {if (a[i] == 1) continue;if (a[i] & 1) {for (int j = 1; j <= n; j++) {if (j != i && ! f[a[i] + a[j]]) {flow::add(i, j, inf);}}}}ll ans = flow::Dinic();for (int i = 1; i <= n; i++) {if (a[i] == 1) {for (int j = 1; j <= n; j++) {if (j != i && ! f[a[j] + 1]) {flow::add(i, j, inf);}}flow::add(S, i, b[i]);ans += flow::Dinic();ans += flow::val[flow::tot - 1] / 2;}}printf("%lld\n", ans);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/820999.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Z-Library镜像网站入口,网页版正式回归了

Z-Library图书馆介绍 Z-Library图书馆是全球最大的在线图书馆之一,拥有超过1400万本书籍和8000万篇文章,涵盖了众多领域的学术文献和文学作品。该图书馆致力于为广大读者提供免费、便捷的电子资源服务,让读者能够轻松获取所需的图书和文献。其数字档案库资源丰富,更新及时,…

彻底搞懂ScheduledThreadPoolExecutor

前言 项目中经常会遇到一些非分布式的调度任务,需要在未来的某个时刻周期性执行。实现这样的功能,我们有多种方式可以选择:Timer类, jdk1.3引入,不推荐。它所有任务都是串行执行的,同一时间只能有一个任务在执行,而且前一个任务的延迟或异常都将会影响到之后的任务。可能…

如何查看织梦CMS网站源码中的数据库信息

1. 定位配置文件文件路径:织梦CMS V5.1:include/config_base.php 织梦CMS V5.3 及以上版本:data/common.inc.php2. 编辑配置文件使用文本编辑器打开 data/common.inc.php 文件,找到数据库连接配置部分。配置文件的内容通常如下所示:<?php // 数据库连接信息 $cfg_dbho…

PbootCMS错误提示:文件上传失败

错误提示:文件上传失败解决方案:检查上传文件夹(通常位于 /upload/)的写权限,确保Web服务器有写入权限。 检查PHP配置文件(php.ini)中的 upload_max_filesize 和 post_max_size 是否足够大。 检查文件类型和大小限制是否符合要求。扫码添加技术【解决问题】专注中小企业…

如何修改网站后台的地址?公司网站被修改怎么改?

如果公司的网站被未经授权的人员修改,你需要迅速采取措施来恢复网站并加强安全性。以下是一些步骤: 1. 确认问题检查网站:确认哪些部分被修改,记录下具体的改动。 通知相关人员:立即通知IT部门或负责网站维护的团队。2. 恢复网站备份恢复:如果有定期备份,从最近的备份中…

日志篇:模组日志总体介绍

​ 今天我们学习合宙模组日志总体介绍,以下进入正文。 一、本文讨论的边界 本文是对合宙 4G 模组, 以及 4G+GNSS 模组的日志功能的总体介绍。通过日志,可以对研发过程中,以及模组运行过程中的各种故障进行分析。 二、4G模组日志的几种类型界 4G 模组的日志有两种类型: 业务…

一篇讲透:模组典型上网业务的AT上网流程

​ 今天我们学习合宙模组典型上网业务的AT上网流程。 文末阅读原文,下载最新教程/固件。 一、简介 本文介绍了合宙4G模组的常用的AT指令和服务器交互的流程。 进一步详细的流程,参见各个模组的AT命令资料。 如果没有顺手的串口工具,推荐 [LLCOM | 能跑Lua代码的串口调试工具…

WPF 使用快捷键方式制作简易的 Word 上的 Latex 输入法

本文将告诉大家如何在 WPF 里面编写一个简易输入法软件,让这个输入法软件支持插入 Latex 格式的公式到 Word 内。核心原理是使用 Word 的快捷键插入公式编辑器,再通过剪贴板输入 Latex 格式的公式内容,再输入回车作为 Word 公式软件的界面效果如下:运行效果如下:本文以下为…

读数据工程之道:设计和构建健壮的数据系统18数据存储系统(上)

数据存储系统(上)1. 单机存储和分布式存储 1.1. 存储系统是存在于原材料之上的抽象层次 1.2. 磁盘是一种原始存储材料,而主要的云对象存储平台和HDFS是利用磁盘的存储系统 1.3. 随着数据存储和访问模式变得越来越复杂,并超出了单一服务器能做到的支持,将数据分布到一个以上…

2024.10.24 鲜花

多次查询给定集合是否存在任一给定子集多次查询给定集合是否存在任一给定子集Re:End of a Dream先考虑经典例题 DZY Loves Chinese II 考虑其做法:随机赋值非树边,用返祖边来平衡使其权值为 \(0\),线性基维护。 考虑扩展,发现集合中并不存在一个唯一元素用来平衡,考虑在每…

指令

带v-的特殊属性即为指令,常见的指令有v-if,v-show,v-html,v-text,v-slot,v-bind,v-on,v-model等等,也可自定义指令。一个指令的任务是在其表达式的值变化时响应式地更新 DOM。除了name为必须外,其他的都可以没有,也可以有,修饰符可以有多个; v-focus v-aa.bb v-aa:aa.b…

温故知新,基于播客形式学习英语之EnglishPod 365, Elementary初级C集合(音频、原文、讲解)

简介 Enishpod是一家公司叫做Praxis Language推出的收费讲座,相比较ESLPod, EnishPod为常速。Enishpod极具趣味性,两位主持人Marco和Amira的讲解很生动幽默,完全有别于新概念类型听力的乏味。同时,Enishpod分了不同的难度级别,基础较差可以先选择B级和C级。 Elementary - …