题意

在长度为 \(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. (转)在.net中检索HTTP请求

    原文转载:https://www.west-wind.com/presentations/dotnetWebRequest/dotnetWebRequest.htm HTTP内容检索是应用程序的重要组 ...

  2. Java中的StringTokenizer类的使用方法

    StringTokenizer是字符串分隔解析类型,属于:java.util包. 1.StringTokenizer的构造函数 StringTokenizer(String str):构造一个用来解析 ...

  3. python下wxpython程序国际化的实践(中文英文切换)

    一.什么是python的国际化(I18N) 有关I18N,百度上解释一大堆,个人比较喜欢这个说法. i18n是 Internationalization 这个英文的简写,因为International ...

  4. Linux uptime命令详解

    常见的命令展示 uptime 08:21:34 up 36 min, 2 users, load average: 0.00, 0.00, 0.00 #当前服务器时间: 08:21:34 #当前服务器 ...

  5. Skype 服务器客户端策略参数优化

    1.skype通讯录原理 对于skype客户端的通讯录同步,首先说说原理,通讯簿信息是从AD同步的skype前端服务器(每天1:30),在从前端服务器同步的客户端(大概1小时内同步一次). skype ...

  6. Linux系统优化之设置swappiness值提高MySQL查询性能

    对MySQL来说,操作系统层面的优化也可以值得考虑一下:就是swappiness. swappiness的大小主要对如何使用swap分区有着密切的联系. 来看一下: [root@chaofeng ~] ...

  7. WINDOWS SOCKET编程中accept出来的新连接是阻塞还是非阻塞

    实践证明 SOCKET hNewSock=accept(hListenSock) 当hListenSock为阻塞模型时,hNewSock则为阻塞模型 否则 当hListenSock为非阻塞模型时,hN ...

  8. windows最常用的快捷键(windows10 )

    windows最常用的快捷键(windows10 ) [单指点击] 单击/双击,相当于鼠标左键. [单指滑动] 控制光标移动. [单指拖动] 相当于按下鼠标左键移动鼠标. [双指点击] 菜单键,相当于 ...

  9. [python] os.path模块常用方法汇总

    os.path.abspath(path) #返回绝对路径 os.path.basename(path) #返回文件名 os.path.commonprefix(list) #返回list(多个路径) ...

  10. linux 的常用命令---------第三阶段

    用户管理 为什么需要用户? 答:linux是一个多用户系统 权限管理(使之权限最小化) 用户:它是对系统中的资源做归属的 : 用户组:在用户组中包含一个或者多个用户,每个用户都同时拥有用户组的权限. ...