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\) 个点到 ...
随机推荐
- QTableWidget设计原则
一.组成结构: 列表控件由水平表头(self.horizontalHeader()).垂直表头(self.verticalHeader())和单元格(QTableWidgetItem)组成 其中表头又 ...
- C++内存使用机制基本概念详解
.程序使用内存区 一个程序占用的内存区一般分为5种: ()全局.静态数据区:存储全局变量及静态变量(包括全局静态变量和局部静态变量) ()常量数据区:存储程序中的常量字符串等. ()代码区:存储程序的 ...
- windows 7下mingw+msys编译ffmpeg
windows 7下mingw+msys编译ffmpeg 1-->下载安装MingW,mingw-get-inst-20120426.exe http://sourceforge.ne ...
- hdu 5616 Jam's balance 正反背包+转换
http://acm.hdu.edu.cn/showproblem.php?pid=5616 思路 题目中蕴含着两种需要计算的重量 1. 从所有的砝码中挑出任意种2.(转换的思想)在天平的两端都挑出这 ...
- stm32 奇怪的位赋值问题 出错了
转载请注明出处:http://blog.csdn.net/qq_26093511/article/category/6094215 1.在51单片机里 ,下面这两种操作方法都是一样的,没有什么问题! ...
- 给JZ2440开发板重新分区
转自:http://mp.weixin.qq.com/s?__biz=MzAxNTAyOTczMw==&mid=2649328035&idx=1&sn=7d3935cc05d3 ...
- rails中一个窗体多个模型——fields_for
详细参考 http://railscasts.com/episodes/73-complex-forms-part-1中part-1.2.3部分 借助field_for可以生成表单来处理两个或更多模型 ...
- Python-socket发送文件并解决粘包问题
服务器端要先根据客户端要下载的文件进行判断是否存在,还要根据文件大小来进行传送,最后还要比对文件的md5值来判断传送的文件是否正确,通过判断剩余字节来解决粘包问题 服务器端 # -*- coding: ...
- css 雪碧图
CSS Sprites在国内很多人叫css精灵,是一种网页图片应用处理方式.它允许你将一个页面涉及到的所有零星图片都包含到一张大图中去,这样一来,当访问 该页面时,载入的图片就不会像以前那样一幅一幅地 ...
- 项目:条件查询 通过StringBulider和ArrayList(参数有序) 手动拼接sql
条件查询的sql拼接 参数拼接 public List<Product> findAll(Product product) throws SQLException { //1.1 拼凑sq ...