发现我们每次区间取反,相邻位置的正反关系只有两个位置发生改变
我们定义bi为ai和ai-1的正反关系,即ai=ai-1时bi=0,否则bi=1,每次取反l~r,b[l]和b[r+1]会发生改变
容易发现b[i]=1的位置一定是偶数个,我们将他们取出来
因为每次取反一定会改变两个b[i],所以我们将这些位置两两配对消去
两个位置i,j,有三种配对
|i-j|是奇素数,可以直接消去,最少花费1次操作
|i-j|是偶数,可以由奇素数的和(哥德巴赫猜想?)或差得到,最少花费2次
|i-j|是奇非素数,由奇素数和偶数差得到,最少花费3次
将b[i]=1的i按奇偶性分为两个集合
不同集合之间的配对是第1、3种配对
同一集合间的配对是第2种
可以做第一种配对的i,j之间连边,找二分图最大匹配
剩下的两个集合内部两两第二种配对
如果还余1个,作第三种配对

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdio>
using namespace std;
#define CLR(a,b) memset(a,b,sizeof(a))
const int maxn = 1e7 + 10;
int a[maxn];
int b[maxn];
int n; int point[210];
int edge[210][210];
int cnt = 0; int nx,ny;
int vis[220];
int cx[220],cy[220];
int dx[220],dy[220]; int prime[maxn],primesize,phi[maxn];
bool isprime[maxn];
void getlist(int listsize)
{
memset(isprime,1,sizeof(isprime));
isprime[1]=false;
for(int i=2;i<=listsize;i++)
{
if(isprime[i])prime[++primesize]=i;
for(int j=1;j<=primesize&&i*prime[j]<=listsize;j++)
{
isprime[i*prime[j]]=false;
if(i%prime[j]==0)break;
}
}
} void pre()
{
getlist(maxn-1);
cin>>n;
for(int i=1;i<=n; i++){
int num;
cin>>num;
a[num] = 1;
if(a[num-1]!=a[num]) b[num] = 1;
else b[num] = 0;
if(a[num]!=a[num+1]) b[num+1] = 1;
else b[num+1] = 0;
}
for(int i=1; i<maxn; i++){
if(b[i] == 1) point[++cnt] = i;
}
for(int i=1; i<=cnt; i++){
if(point[i]%2 == 1) nx++,dx[nx] = point[i];
else ny++,dy[ny] = point[i];
}
// cout<<nx<<" "<<ny<<endl;
for(int i=1; i<=nx; i++){
for(int j=1; j<=ny; j++){
if(isprime[abs(dx[i] - dy[j])])
edge[i][j] = 1;
// cout<<dx[i]<<" "<<dy[j]<<endl;
}
}
} bool path(int u)
{
for(int i=1; i<=ny; i++){
if(edge[u][i] && !vis[i]){
vis[i] = 1;
if(path(cy[i]) || cy[i] == -1){
cx[u] = i;
cy[i] = u;
return 1;
}
}
}
return 0;
} int maxmatch()
{
int res = 0;
CLR(cx,0xff);
CLR(cy,0xff); for(int i=1;i<=nx;i++){
CLR(vis,0);
res += path(i);
}
return res;
} int main()
{
// freopen("in.txt","r",stdin);
pre();
int ans = 0;
int edgenum = maxmatch();
// cout<<"edge "<<edgenum<<endl;
// for(int i = 1; i<=nx; i++)
// cout<<dx[i]<<" "<<dy[cx[i]]<<endl;
ans += edgenum;
ans += ((nx-edgenum)/2)*2;
ans += ((ny-edgenum)/2)*2;
if((nx-edgenum)%2 == 1) ans+=3;
cout<<ans<<endl;
return 0;
}

Prime Flip AtCoder - 2689的更多相关文章

  1. [Arc080F]Prime Flip

    [Arc080F]Prime Flip Description 你有无限多的"给给全",编号为1,2,3,....开始时,第x1,x2,...,xN个"给给全" ...

  2. 【Atcoder】ARC 080 F - Prime Flip

    [算法]数论,二分图最大匹配 [题意]有无限张牌,给定n张面朝上的牌的坐标(N<=100),其它牌面朝下,每次操作可以选定一个>=3的素数p,并翻转连续p张牌,求最少操作次数使所有牌向下. ...

  3. Prime Distance POJ - 2689 (数学 素数)

    The branch of mathematics called number theory is about properties of numbers. One of the areas that ...

  4. Prime Distance POJ - 2689 线性筛

    一个数 $n$ 必有一个不超过 $\sqrt n$ 的质因子. 打表处理出 $1$ 到 $\sqrt n$ 的质因子后去筛掉属于 $L$ 到 $R$ 区间的素数即可. Code: #include&l ...

  5. AT2689 [ARC080D] Prime Flip

    简要题解如下: 区间修改问题,使用差分转化为单点问题. 问题变成,一开始有 \(2n\) 个点为 \(1\),每次操作可以选择 \(r - l\) 为奇质数的两个点 \(l, r\) 使其 ^ \(1 ...

  6. 【arc080F】Prime Flip

    Portal --> arc080_f Solution ​  这题的话..差分套路题(算吗?反正就是想到差分就很好想了qwq) ​​  (但是问题就是我不会这种套路啊qwq题解原话是:&quo ...

  7. 【ARC080F】Prime Flip 差分+二分图匹配

    Description ​ 有无穷个硬币,初始有n个正面向上,其余均正面向下.  你每次可以选择一个奇质数p,并将连续p个硬币都翻转.  问最小操作次数使得所有硬币均正面向下. Input ​ 第一行 ...

  8. AT2689 Prime Flip

    传送门 这个题是真的巧妙 首先一个很巧妙的思路,差分 考虑假如\(a_i!=a_{i-1}\),则\(b_i=1\),否则\(b_i=0\) 这样一来,一个区间的翻转就变成了对于两个数的取反了 然后我 ...

  9. [atARC080F]Prime Flip

    构造一个数组$b_{i}$(初始为0),对于操作$[l_{i},r_{i}]$,令$b_{l_{i}}$和$b_{r_{i}+1}$值异或1,表示$i$和$i-1$的差值发生改变,最终即要求若干个$b ...

随机推荐

  1. JAVA中通过Jedis操作Redis连接与插入简单库

    一.简述 JAVA中通过Jedis操作Redis连接与插入简单库 二.依赖 <!-- https://mvnrepository.com/artifact/redis.clients/jedis ...

  2. 树莓派raspberry pi配置无线路由器AP

    raspi-config进入系统配置面板 进行 Expand Filesystem  扩展文件系统否则备份系统的时候备份文件会急速膨胀. (1)配置网络环境nano /etc/network/inte ...

  3. [开源]开放域实体抽取泛用工具 NetCore2.1

    开放域实体抽取泛用工具 https://github.com/magicdict/FDDC 更新时间 2018年7月16日 By 带着兔子去旅行 开发这个工具的起源是天池大数据竞赛,FDDC2018金 ...

  4. [转]numpy 100道练习题

    100 numpy exercise 翻译:YingJoy 网址: https://www.yingjoy.cn/ 来源:https://github.com/rougier/numpy-100 Nu ...

  5. Java读取Excel内容

    借助于apathe的poi.jar,由于上传文件不支持.jar所以请下载后将文件改为.jar,在应用程序中添加poi.jar包,并将需要读取的excel文件放入根目录即可 本例使用java来读取exc ...

  6. Apigee 简介与简单试用

     Apigee (国内访问需要***)是一家成立于2004年的API管理公司,于2016年9月被Google收购,作为Google云的服务之一.Apigee提供从API设计.开发.管理.门户.网关等 ...

  7. Fluent动网格【9】:区域运动

    本文所述的区域运动并非动网格中的运动域,而是指在多参考系(MRF)或滑移网格中所涉及到的区域的运动. 在滑移网格中指定区域运动时,除了能够指定绝对运动外,还能指定某一区域与其他区域间的相对运动,如图所 ...

  8. SLAM的前世今生

    SLAM技术已经蓬勃发展起来,这里综述性地介绍下SLAM的主体知识.SLAM的主体技术不多,难点在于细节.来源是:技术分享.ppt 前世 人类惆怅近千年的问题不是:我是谁,我要做什么,我要去哪里!而是 ...

  9. Oracle分析函数-first_value()和last_value()

    first_value()和last_value()字面意思已经很直观了,取首尾记录值.例:查询部门最早发生销售记录日期和最近发生的销售记录日期 select dept_id ,sale_date , ...

  10. 启动matlab时总是直接跳转到安装界面的解决方案

    [关于2017双11过后MATLAB许可过期问题的解决方案] 在距离双11还有2个月之前,matlab会提示:Your MATLAB license will expire in 50 days -- ...