AT2689 [ARC080D] Prime Flip
简要题解如下:
区间修改问题,使用差分转化为单点问题。
问题变成,一开始有 \(2n\) 个点为 \(1\),每次操作可以选择 \(r - l\) 为奇质数的两个点 \(l, r\) 使其
^\(1\)。根据哥德巴赫猜想可以发现,若 \(r - l\) 为奇质数显然一次即可,若 \(r - l\) 为偶数则需两次,若 \(r - l\) 为奇数则需三次。
近一步可以发现,若想消去两个点 \(l, r\) 则涉及其他点是可以通过调整使得直接消去两个点的。
更近一步可以发现,将所有点按照奇偶分类,显然若消去奇偶性相同的两个数只能 \(2\) 次,那么首先将差是奇质数的点一起消去肯定是最优的。
因为差是奇质数的点必然一个为偶数一个为奇数构成二分图,于是可以使用匈牙利或网络流解决二分图最大匹配问题。
剩下的肯定要同集合内部按照 \(2\) 次消去,最后若还剩一个元素才使用 \(3\) 次的方法。
#include <bits/stdc++.h>
using namespace std;
#define rep(i, l, r) for (int i = l; i <= r; ++i)
#define Next(i, u) for (int i = cur[u]; i; i = e[i].next)
const int N = 2e4 + 5;
const int M = 1e7 + 5;
struct edge { int v, next, w;} e[N << 1];
int n, s, t, F, ans, cnt, tot = 1, ton[2], a[N], h[N], d[M];
namespace PR {
bool iprime[M]; int tot, prime[M];
void sieve(int L) {
iprime[1] = 1;
rep(i, 2, L) {
if(!iprime[i]) prime[++tot] = i;
for (int j = 1; j <= tot && i * prime[j] <= L; ++j) {
iprime[i * prime[j]] = true;
if(i % prime[j] == 0) break;
}
}
}
}
namespace FL {
bool book[N]; int dep[N], cur[N];
bool bfs(int s, int t) {
rep(i, s, t) cur[i] = h[i], dep[i] = -t;
queue <int> Q;
dep[s] = 1, Q.push(s);
while (!Q.empty()) {
int u = Q.front(); Q.pop();
Next(i, u) {
int v = e[i].v; if(!e[i].w || dep[v] > 0) continue;
dep[v] = dep[u] + 1, Q.push(v);
}
}
return dep[t] > 0;
}
int dfs(int u, int lim) {
if(u == t) return lim;
int flow = 0, rflow = 0; book[u] = true;
Next(i, u) {
int v = e[i].v; cur[u] = i;
if(!book[v] && dep[v] == dep[u] + 1 && e[i].w && (rflow = dfs(v, min(e[i].w, lim)))) {
flow += rflow, lim -= rflow, e[i].w -= rflow, e[i ^ 1].w += rflow;
if(!lim) break;
}
}
book[u] = false; return flow;
}
}
void add(int u, int v, int w) {
e[++tot].v = v, e[tot].w = w, e[tot].next = h[u], h[u] = tot;
e[++tot].v = u, e[tot].w = 0, e[tot].next = h[v], h[v] = tot;
}
int main () {
cin >> n;
rep(i, 1, n) cin >> a[i], d[a[i]] ^= 1, d[a[i] + 1] ^= 1;
PR :: sieve(M - 1);
s = cnt = 1;
rep(i, 1, M - 1) if(d[i]) a[++cnt] = i, ++ton[i & 1];
t = ++cnt;
rep(i, 2, cnt - 1) {
if(a[i] & 1) add(s, i, 1);
else add(i, t, 1);
}
rep(i, 2, cnt - 1) if(a[i] & 1) {
rep(j, 2, cnt - 1) if(!(a[j] & 1) && !(PR :: iprime[abs(a[j] - a[i])])) add(i, j, 1);
}
while (FL :: bfs(s, t)) ans += FL :: dfs(s, cnt);
if((ton[0] - ans) & 1) F = 1;
ans += 2 * ((ton[0] - ans) / 2 + (ton[1] - ans) / 2);
ans += F * 3;
printf("%d", ans);
return 0;
}
首先区间修改差分转单点是非常重要的,可以减少有效修改点数,方便于观察问题。
对于某个数能被质数 / 奇质数组成的问题,一定要敏锐地想到 哥德巴赫猜想
AT2689 [ARC080D] Prime Flip的更多相关文章
- [Arc080F]Prime Flip
[Arc080F]Prime Flip Description 你有无限多的"给给全",编号为1,2,3,....开始时,第x1,x2,...,xN个"给给全" ...
- AT2689 Prime Flip
传送门 这个题是真的巧妙 首先一个很巧妙的思路,差分 考虑假如\(a_i!=a_{i-1}\),则\(b_i=1\),否则\(b_i=0\) 这样一来,一个区间的翻转就变成了对于两个数的取反了 然后我 ...
- Prime Flip AtCoder - 2689
发现我们每次区间取反,相邻位置的正反关系只有两个位置发生改变 我们定义bi为ai和ai-1的正反关系,即ai=ai-1时bi=0,否则bi=1,每次取反l~r,b[l]和b[r+1]会发生改变 容易发 ...
- 【arc080F】Prime Flip
Portal --> arc080_f Solution 这题的话..差分套路题(算吗?反正就是想到差分就很好想了qwq) (但是问题就是我不会这种套路啊qwq题解原话是:&quo ...
- 【ARC080F】Prime Flip 差分+二分图匹配
Description 有无穷个硬币,初始有n个正面向上,其余均正面向下. 你每次可以选择一个奇质数p,并将连续p个硬币都翻转. 问最小操作次数使得所有硬币均正面向下. Input 第一行 ...
- 【Atcoder】ARC 080 F - Prime Flip
[算法]数论,二分图最大匹配 [题意]有无限张牌,给定n张面朝上的牌的坐标(N<=100),其它牌面朝下,每次操作可以选定一个>=3的素数p,并翻转连续p张牌,求最少操作次数使所有牌向下. ...
- [atARC080F]Prime Flip
构造一个数组$b_{i}$(初始为0),对于操作$[l_{i},r_{i}]$,令$b_{l_{i}}$和$b_{r_{i}+1}$值异或1,表示$i$和$i-1$的差值发生改变,最终即要求若干个$b ...
- Java基础之写文件——从多个缓冲区写(GatheringWrite)
控制台程序,使用单个写操作将数据从多个缓冲区按顺序传输到文件,这称为集中写(GatheringWrite)操作.这个功能的优势是能够避免在将信息写入到文件中之前将信息复制到单个缓冲区中.从每个缓冲区写 ...
- Atcoder 乱做
最近感觉自己思维僵化,啥都不会做了-- ARC103 F Distance Sums 题意 给定第 \(i\) 个点到所有点的距离和 \(D_i\) ,要求构造一棵合法的树.满足第 \(i\) 个点到 ...
随机推荐
- Scalable Rule-Based Representation Learning for Interpretable Classification
目录 概 主要内容 Wang Z., Zhang W., Liu N. and Wang J. Scalable rule-based representation learning for inte ...
- [opencv]opencv主要组件介绍
[calib3d]--其实就是就是Calibration(校准)加3D这两个词的组合缩写.这个模块主要是相机校准和三维重建相关的内容.基本的多视角几何算法,单个立体摄像头标定,物体姿态估计,立体相似性 ...
- RTD2172替代方案|TYPEC转HDMI4K@60HZ拓展坞|CS5265替代RTD2172
瑞昱RTD2172是TYPEC转HDMI4K60HZ音视频数据转换器芯片.CS5265可以替代兼容RTD2172,除了实现同等的转换功能外且整体方案成本和性价比方面比RTD2172要高,且外围器件较少 ...
- DOTween实现缓动变值动效
DOTween.To(getter, setter, to, float duration) 是常用的一个变值方法(一定时间将某变量从起始值到终点值进行变化),可以便捷实现 滚分.涨进度条 等功能 但 ...
- docker构建.net core运行的镜像
在docker很火的今天,越来越多的应用现在都在往docker上迁移,.net core怎么能落后? 项目要运行在docker上,我们需要先制作镜像,可以基于centos来制作,当然也可以基于Ubun ...
- 深入 Laravel 内核之 PHP 反射机制和依赖注入
结论: PHP中提供了反射类来解析类的结构: 通过反射类可以获取到类的构造函数及其参数和依赖: 给构造函数的参数递归设置默认值后,即可使用这些带默认值的参数通过 newInstanceArgs 实例化 ...
- Java 私有接口 【类中嵌套接口】
1.前言 接口十分常用,能规范实现类的命名 和 实现多个实现类的向上转型成统一类型 ,但是接口的修饰符只能是 public吗? 当然不是,可以是private , 难道是像这样? 显然不可以,已经报错 ...
- PPT制作手机滑动效果
原文链接: https://www.toutiao.com/i6495341287196066317/ 我们添加一个手机图片 选择"插入"选项卡,插入两条直线,如下图所示.插入直线 ...
- stm32单片机利用ntc热敏电阻温度转换公式C语言版
首先 我们需要明确电路结构 热敏电阻的原理就不再赘述,本文不凑字数,只讲干货 必须要知道的就是串联电阻R9程序中定义为resistanceInSeries ,精度越高越好 为了方便,先在程序中定义好你 ...
- 动静分离、Rewirte、HTTPS
目录 Nginx动静分离技术 示例搭建步骤 部署NFS 静态资源共享 部署代理服务器 Rewrite(重点) Rewrite基本概述 rewrite语法 rewrite标记Flag last和brea ...