Prime Flip AtCoder - 2689
发现我们每次区间取反,相邻位置的正反关系只有两个位置发生改变
我们定义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的更多相关文章
- [Arc080F]Prime Flip
[Arc080F]Prime Flip Description 你有无限多的"给给全",编号为1,2,3,....开始时,第x1,x2,...,xN个"给给全" ...
- 【Atcoder】ARC 080 F - Prime Flip
[算法]数论,二分图最大匹配 [题意]有无限张牌,给定n张面朝上的牌的坐标(N<=100),其它牌面朝下,每次操作可以选定一个>=3的素数p,并翻转连续p张牌,求最少操作次数使所有牌向下. ...
- Prime Distance POJ - 2689 (数学 素数)
The branch of mathematics called number theory is about properties of numbers. One of the areas that ...
- Prime Distance POJ - 2689 线性筛
一个数 $n$ 必有一个不超过 $\sqrt n$ 的质因子. 打表处理出 $1$ 到 $\sqrt n$ 的质因子后去筛掉属于 $L$ 到 $R$ 区间的素数即可. Code: #include&l ...
- AT2689 [ARC080D] Prime Flip
简要题解如下: 区间修改问题,使用差分转化为单点问题. 问题变成,一开始有 \(2n\) 个点为 \(1\),每次操作可以选择 \(r - l\) 为奇质数的两个点 \(l, r\) 使其 ^ \(1 ...
- 【arc080F】Prime Flip
Portal --> arc080_f Solution 这题的话..差分套路题(算吗?反正就是想到差分就很好想了qwq) (但是问题就是我不会这种套路啊qwq题解原话是:&quo ...
- 【ARC080F】Prime Flip 差分+二分图匹配
Description 有无穷个硬币,初始有n个正面向上,其余均正面向下. 你每次可以选择一个奇质数p,并将连续p个硬币都翻转. 问最小操作次数使得所有硬币均正面向下. Input 第一行 ...
- AT2689 Prime Flip
传送门 这个题是真的巧妙 首先一个很巧妙的思路,差分 考虑假如\(a_i!=a_{i-1}\),则\(b_i=1\),否则\(b_i=0\) 这样一来,一个区间的翻转就变成了对于两个数的取反了 然后我 ...
- [atARC080F]Prime Flip
构造一个数组$b_{i}$(初始为0),对于操作$[l_{i},r_{i}]$,令$b_{l_{i}}$和$b_{r_{i}+1}$值异或1,表示$i$和$i-1$的差值发生改变,最终即要求若干个$b ...
随机推荐
- CentOS7 使用yum命令安装Java SDK(openjdk)
CentOS 6.X 和 7.X 自带有OpenJDK runtime environment (openjdk).它是一个在linux上实现开源的java 平台. 安装方式: 1.输入以下命令,以 ...
- 【PMP】组织结构类型
1.简单型 描述:人员并肩工作,所有者/经营者直接做出主要决定并监督执行. PM角色:兼职(协调员) PM权限:极少(无) 项目管理人员:极少(无) 资源可用性:极少(无) 项目预算管理人:负责人 2 ...
- 使用插件扩展Docker
http://wwwbuild.net/dockerone/241249.html Docker吸引我的,同时也是促使其成功的一个重要方面,是其开箱即用的特性. “开箱即用”是指什么呢?简单来说, ...
- OpenLayers4地图实例-功能齐全
网址:http://api.rivermap.cn/openlayers4/map.min.html 标注 工具
- linux内核剖析(九)进程间通信之-信号signal
信号及信号来源 什么是信号 信号是UNIX和Linux系统响应某些条件而产生的一个事件,接收到该信号的进程会相应地采取一些行动.通常信号是由一个错误产生的.但它们还可以作为进程间通信或修改行为的一种方 ...
- CentOS 6.5 x64下网络配置
一.自动获取IP地址 #dhclient 自动获取ip地址命令 #ifconfig 查询系统里网卡信息,ip地址.MAC地址 [root@CentOS6 ~]# vi /etc/sysconfig/n ...
- Android中的指纹识别
转载请注明出处:http://blog.csdn.net/wl9739/article/details/52444671 评论中非常多朋友反映,依据我给出的方案,拿不到指纹信息这个问题,在这里统一说明 ...
- [svc]容器网络学习索引及网络监控
整理的可能有些误失,抽时间在细细的分类完善下. 发现这篇对于网络从低到高层协议整理的还不错 每层都有一些有意思的话题 一些协议有一些设计上的弱点, 所以产生了种种的网络层安全问题 一般我们学一些 1, ...
- Java8新特性interface中的static方法和default方法
static方法 java8中为接口新增了一项功能:定义一个或者更多个静态方法.用法和普通的static方法一样. 代码示例 public interface InterfaceA { /** * 静 ...
- nlp资料网站
原文地址 http://blog.sina.com.cn/s/blog_574a437f01019poo.html 昨天实验室一位刚进组的同学发邮件来问我如何查找学术论文,这让我想起自己刚读研究生时茫 ...