题意

在长度为 \(n\) 的序列 \(a\) 中选择尽量长的子序列,使得选出子序列中任意两个数的和不为质数。

\(n\leq3000\ ,a_i\leq10^5\).

分析

直接按照奇偶性建立二分图,两个数之和如果为质数连边,跑独立集。

假设\(a+b= p_1\ ,a+c=p_2\) ,在除了 \(1+1=2\) 的情况下 \(b,c\) 奇偶性相同,构成合数。

所以总边数不会达到 \(n^2\) ,注意选出子序列中最多存在一个1.

总时间复杂度为 \(Dinic\) 时间复杂度。

代码

#include<bits/stdc++.h>
using namespace std;
#define go(u) for(int i=head[u],v=e[i].to;i;i=e[i].last,v=e[i].to)
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define pb push_back
#define re(x) memset(x,0,sizeof x)
typedef long long LL;
inline int gi(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-48;ch=getchar();}
return x*f;
}
template<typename T>inline bool Max(T &a,T b){return a<b?a=b,1:0;}
template<typename T>inline bool Min(T &a,T b){return b<a?a=b,1:0;}
const int N=3007,inf=0x3f3f3f3f,Num=2e5;
int n;
int vis[200007],a[N],mark[N];
namespace MF{
int edc=1,S,T,ndc,sum;
int dep[N],cur[N];
struct edge{int to,cap,flow;}e[1000007];
vector<int>G[N];
void Add(int a,int b,int c){
e[++edc]=(edge){b,c,0},G[a].push_back(edc);
e[++edc]=(edge){a,0,0},G[b].push_back(edc);
}
bool bfs(){
queue<int>Q;
re(dep);re(cur);dep[S]=1,Q.push(S);
while(!Q.empty()){
int u=Q.front();Q.pop();
for(int i=0;i<G[u].size();i++){
edge &E=e[G[u][i]];
if(E.cap>E.flow&&!dep[E.to])
dep[E.to]=dep[u]+1,Q.push(E.to);
}
}
return dep[T];
}
int dfs(int u,int b){
if(u==T||!b) return b;
int flow=0,f;
for(int &i=cur[u];i<G[u].size();i++){
edge &E=e[G[u][i]];
if(dep[u]+1==dep[E.to]){
f=dfs(E.to,min(b,E.cap-E.flow));
flow+=f,E.flow+=f,b-=f,e[G[u][i]^1].flow-=f;
if(!b) break;
}
}
return flow;
}
int maxflow(){
int res=0;
while(bfs()) res+=dfs(S,inf);return res;
}
}
int main(){
#ifndef ONLINE_JUDGE
#endif
using namespace MF;
n=gi();S=n+1,T=S+1;int cnt=0;
for(int i=2;i<=Num;++i) if(!vis[i])
for(int j=i+i;j<=Num;j+=i) vis[j]=1;
bool fi=1;
rep(i,1,n) {
a[i]=gi();
if(a[i]==1&&fi) fi=0;
else if(a[i]==1) mark[i]=1,++cnt;
}
rep(i,1,n)if(a[i]&1&&!mark[i])
rep(j,1,n)if(!mark[j]&&!(a[j]&1)&&!vis[a[i]+a[j]]) Add(i,j,1);
rep(i,1,n) if(!mark[i]){
if(a[i]&1) Add(S,i,1);
else Add(i,T,1);
}
printf("%d\n",n-maxflow()-cnt);
return 0;
}

[BZOJ4857][JSOI2016]反质数序列[最大点独立集]的更多相关文章

  1. [JSOI2016]反质数序列

    我竟然半个小时切了一道JSOI2016,,,,不敢相信. 首先可以发现,如果N个数中1出现的次数<=1的话,我们按不能在一个集合连无向边的话,连出的一定是一个二分图. 接下来我来证明一下: 因为 ...

  2. [BZOJ 4857][Jsoi2016]反质数序列

    传送门 $ \color{green} {solution : } $ 因为 $ 1 $ 的个数我们最多只能选一个,所以剩下的数如果组成素数那么只有一奇一偶,显然是个二分图模型 #include &l ...

  3. 【LOJ】#2081. 「JSOI2016」反质数序列

    题解 我居然都没反应过来二分图内选集合两两不能有边是最大独立集了 我退役吧 显然连边只能在奇数和偶数之间,然后二分图求最大独立集是节点数-最大匹配数 啊当然还有对于1的话只能留一个1 代码 #incl ...

  4. BZOJ 4857 反质数序列

    题面 奇数+奇数一定不是质数(1+1除外),偶数+偶数一定不是质数,质数只可能出现在偶数+奇数中 把所有的点排成两列,权值为奇数的点在左边,权值为偶数的在右边 如果左边的点x+右边的点y是质数,我们就 ...

  5. 【最大团转最大点独立集(匈牙利算法+时间戳优化)】BZOJ2744-[HEOI2012]朋友圈

    [题目大意] 有两个国家A和B.存在以下朋友关系: 1.A国:每个人都有一个友善值,当两个A国人的友善值a.b,如果a xor b mod 2=1,那么这两个人都是朋友,否则不是: 2.B国:每个人都 ...

  6. LightOJ1171 Knights in Chessboard (II)(二分图最大点独立集)

    题目 Source http://www.lightoj.com/volume_showproblem.php?problem=1171 Description Given an m x n ches ...

  7. CNUOJ 0486 800401反质数

    难度级别:A: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 将正整数 x 的约数个数表示为 g(x).例如,g(1)=1,g(4)=3, g ...

  8. 反质数问题,求不大于n的最大反质数

    反质数:设f(n)表示n个约数的个数,如果对于任意x有0<x<n, f(x) < f(n),那么n就是一个反质数 我们都知道对于任意一个数n,都可以用质数乘积的形式表示出来:x = ...

  9. POJ1466 Girls and Boys(二分图最大点独立集)

    最大点独立集就是无向图中最多的两两不相邻的点集. 二分图最大点独立集=顶点数-二分图最大边独立集(二分图最大匹配) 这一题男女分别作YX部,如果x和y有浪漫关系则连边,如此构造二分图,答案显然就是最大 ...

随机推荐

  1. 为何SQL SERVER使用sa账号登录还原数据库BAK文件失败,但是使用windows登录就可以

    今天发现一个问题,就是公司开发服务器上的sql server使用sa账号登录后,还原一个数据库bak文件老是报错,错误如下: TITLE: Microsoft SQL Server Managemen ...

  2. Windows7 添加快速启动栏

    解决方案: 1.右击任务栏空白处,选择“工具栏”,单击“新建工具栏”: 2.输入“%userprofile%\AppData\Roaming\Microsoft\Internet Explorer\Q ...

  3. AWS服务学习

    什么是云计算? 云计算是用户通过Internet云服务平台按需提供计算能力.数据库存储.应用程序和其他IT资源,采用按需支付定价模式 无论您是在运行拥有数百万移动用户的照片共享应用程序,还是要为您的业 ...

  4. Docker技术入门与实战 第二版-学习笔记-7-数据管理(volume)

    Docker 数据管理 为什么要进行数据管理呢?因为当我们在使用container时,可能会在里面创建一些数据或文件,但是当我们停掉或删除这个容器时,这些数据或文件也会同样被删除,这是我们并不想看见的 ...

  5. 杀掉gpu上的程序

    https://blog.csdn.net/flysky_jay/article/details/82142254 当然也可以使用top找进程,但这种方式更好

  6. WorldWind源码剖析系列:设置类SettingsBase

    PluginSDK中的星球设置类WorldSettings 和WorldWind.程序设置类WorldWindSettings均继承自父类SettingsBase.类图如下所示.其中父类Setting ...

  7. 【转】阿里云Ubuntu系统搭建SVN服务器

    ##SVN服务器相关软件安装 1.使用SSH远程服务器 (1)对于MAC OS/Liunx的用户直接打开终端输入 ssh  用户名@实例名,例如 ssh root@192.168.1.100 执行上面 ...

  8. easyui validatebox textbox 使用例子

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebFormTextbox ...

  9. 通过cgroup给docker的CPU和内存资源做限制

    1.cpu docker run -it --cpu-period=100000 --cpu-quota=2000 ubuntu /bin/bash 相当于只能使用20%的CPU 在每个100ms的时 ...

  10. (转)Centos7 修改硬件时间和系统时间

    查看硬件时间 [root@localhost ~]# hwclock --show Tue 13 Jun 2017 02:11:12 AM CST -0.848845 seconds 1 2 可以看出 ...