AT2689 Prime Flip
传送门
这个题是真的巧妙
首先一个很巧妙的思路,差分
考虑假如\(a_i!=a_{i-1}\),则\(b_i=1\),否则\(b_i=0\)
这样一来,一个区间的翻转就变成了对于两个数的取反了
然后我们来考虑一下取反的代价(没错这个题我就只想到了这个)
1、假如距离是奇质数,只要1步,显然
2、假如距离是偶数,引用一下哥德巴赫猜想,2步即可
3、假如距离是奇合数,就是3步(奇质数+偶数)
显然我们可以把这些\(b_i=1\)的按照奇偶性分为2组
组内距离一定是奇数,组与组之间可能是奇质数也可能是奇合数
但是我们显然需要距离为奇质数最多,所以考虑将两组间距离为奇质数的连边,跑二分图最大匹配
然后假设最大匹配是\(k\),两组的size分别是\(size1,size2\)
那么答案显然是\(ans=k+\lfloor\frac{size1-k}{2}\rfloor*2+\lfloor\frac{size2-k}{2}\rfloor*2+(size1-k)\%2*3\)
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<queue>
#include<cmath>
using namespace std;
void read(int &x){
char ch;bool ok;
for(ok=0,ch=getchar();!isdigit(ch);ch=getchar())if(ch=='-')ok=1;
for(x=0;isdigit(ch);x=x*10+ch-'0',ch=getchar());if(ok)x=-x;
}
#define rg register
const int maxn=210;bool vis[maxn];
int f[maxn],n,ans,a[maxn],mp[maxn][maxn],b[maxn],tot1,tot2,x[maxn];
bool check(int x){
if((!(x&1))||x==1)return 0;
int n=sqrt(x);
for(rg int i=2;i<=n;i++)
if(!(x%i))return 0;
return 1;
}
bool dfs(int x){
for(rg int i=1;i<=tot2;i++)
if(!vis[i]&&mp[x][i]){
vis[i]=1;
if(!f[i]||dfs(f[i]))return f[i]=x,1;
}
return 0;
}
int main(){
read(n);
for(rg int i=1;i<=n;i++)read(x[i]);
if(n==1){printf("3\n");return 0;}
for(rg int i=1;i<=n;i++){
if(x[i+1]-x[i]!=1||i==n){
if((x[i]+1)%2==0)a[++tot1]=x[i]+1;
else b[++tot2]=x[i]+1;
}
if(x[i]-x[i-1]!=1||i==1){
if(x[i]&1)b[++tot2]=x[i];
else a[++tot1]=x[i];
}
}
for(rg int i=1;i<=tot1;i++)
for(rg int j=1;j<=tot2;j++)
if(check(abs(a[i]-b[j])))mp[i][j]=1;
for(rg int i=1;i<=tot1;i++){
memset(vis,0,sizeof vis);
if(dfs(i))ans++;
}
printf("%d\n",ans+(tot1-ans)/2*2+(tot2-ans)/2*2+(tot1-ans)%2*3);
}
AT2689 Prime Flip的更多相关文章
- [Arc080F]Prime Flip
[Arc080F]Prime Flip Description 你有无限多的"给给全",编号为1,2,3,....开始时,第x1,x2,...,xN个"给给全" ...
- AT2689 [ARC080D] Prime Flip
简要题解如下: 区间修改问题,使用差分转化为单点问题. 问题变成,一开始有 \(2n\) 个点为 \(1\),每次操作可以选择 \(r - l\) 为奇质数的两个点 \(l, r\) 使其 ^ \(1 ...
- 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\) 个点到 ...
随机推荐
- Angular.forEach用法
1.针对对象循环(key,value) 官方示例: var values = {name: 'misko', gender: 'male'}; var log = []; angular.forEac ...
- Python:删除字符串中的字符
一.删除字符串两端的一种或多种字符 #strip().lstrip().rstrip()方法:(默认删除空格符) A.list.strip(字符):删除字符串两端的一种或多种字符: #例:删除字符串s ...
- css关于内外边距的详细解释
贴图吧,图一眼明了. 无效果时候有 只有一个<div>啦啦啦</div> 只有padding时候有: padding详细设计时: 解释:padding是对内的,如padding ...
- IIS及时回收
在打开的列表中更改以下设置:回收——固定时间间隔(分钟) 改为 0进程模型——闲置超时(分钟) 改为 0
- 报错apachectl restart
httpd not running, trying to start(98)Address already in use: make_sock: could not bind to address [ ...
- javadoc 工具生成开发API文档
=====================先来一点成就感===================== package com.springMybatis.dao; import com.springMy ...
- winform 客户端 HTTP协议与服务端通信以及解决中文乱码
本来从来没有仔细研究过Http协议,今天因为公司业务需求,调试了半天,终于现在会Winform用Http协议与服务端通信了,其中常用的有POST和Get方式: 仔细看了人人网和新浪等大部分都是采用GE ...
- IIS7.0(虚拟机)发布MVC5程序出现Http403错误的解决方法.
近来,用MVC5开发自己的一个小网站.网上租用了一个小空间(虚拟主机),可选.net版本为2.0 3.0 3.5 4.0 ,上传网站 后发现是403错误.不能访问. 经与技术人员联系,把虚拟机更换到高 ...
- #410div2C. Mike and gcd problem
C. Mike and gcd problem time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- Jmeter进行简单mysql数据库测试
1.环境准备: mysql: mysql-5.7.17.msi jdbc驱动: 自己百度一下即可 Jmeter: 3.2 2.打开Jmeter,创建测试计划, 点击浏览,添加jdbc驱动 3.添 ...