[BZOJ4857][JSOI2016]反质数序列[最大点独立集]
题意
在长度为 \(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]反质数序列[最大点独立集]的更多相关文章
- [JSOI2016]反质数序列
我竟然半个小时切了一道JSOI2016,,,,不敢相信. 首先可以发现,如果N个数中1出现的次数<=1的话,我们按不能在一个集合连无向边的话,连出的一定是一个二分图. 接下来我来证明一下: 因为 ...
- [BZOJ 4857][Jsoi2016]反质数序列
传送门 $ \color{green} {solution : } $ 因为 $ 1 $ 的个数我们最多只能选一个,所以剩下的数如果组成素数那么只有一奇一偶,显然是个二分图模型 #include &l ...
- 【LOJ】#2081. 「JSOI2016」反质数序列
题解 我居然都没反应过来二分图内选集合两两不能有边是最大独立集了 我退役吧 显然连边只能在奇数和偶数之间,然后二分图求最大独立集是节点数-最大匹配数 啊当然还有对于1的话只能留一个1 代码 #incl ...
- BZOJ 4857 反质数序列
题面 奇数+奇数一定不是质数(1+1除外),偶数+偶数一定不是质数,质数只可能出现在偶数+奇数中 把所有的点排成两列,权值为奇数的点在左边,权值为偶数的在右边 如果左边的点x+右边的点y是质数,我们就 ...
- 【最大团转最大点独立集(匈牙利算法+时间戳优化)】BZOJ2744-[HEOI2012]朋友圈
[题目大意] 有两个国家A和B.存在以下朋友关系: 1.A国:每个人都有一个友善值,当两个A国人的友善值a.b,如果a xor b mod 2=1,那么这两个人都是朋友,否则不是: 2.B国:每个人都 ...
- LightOJ1171 Knights in Chessboard (II)(二分图最大点独立集)
题目 Source http://www.lightoj.com/volume_showproblem.php?problem=1171 Description Given an m x n ches ...
- CNUOJ 0486 800401反质数
难度级别:A: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 将正整数 x 的约数个数表示为 g(x).例如,g(1)=1,g(4)=3, g ...
- 反质数问题,求不大于n的最大反质数
反质数:设f(n)表示n个约数的个数,如果对于任意x有0<x<n, f(x) < f(n),那么n就是一个反质数 我们都知道对于任意一个数n,都可以用质数乘积的形式表示出来:x = ...
- POJ1466 Girls and Boys(二分图最大点独立集)
最大点独立集就是无向图中最多的两两不相邻的点集. 二分图最大点独立集=顶点数-二分图最大边独立集(二分图最大匹配) 这一题男女分别作YX部,如果x和y有浪漫关系则连边,如此构造二分图,答案显然就是最大 ...
随机推荐
- EVE Online Third Party Development
第一部分:price_history表 # 建表语句 CREATE TABLE IF NOT EXISTS `price_history` ( `regionID` INT NOT NULL, `ty ...
- search文件中的config
config文件中出现这句话时,代表该部分search应写成文件中封装好的search部分.即: var search = null; this.search = search; se ...
- length() 用法
length:(字符串 | 列):求出字符串的长度: 求出bqh4表中zym列的长度. select * from bqh4select a.*,length(zym) from bqh4 a
- PHP 定界符
双引号和单引号是常用的字符串定界符,在php4.0以后 还可以使用字符串定界符<<<,功能和双引号差不多,用法如下 <<<标识符 字符串 标识符 其中最后的标识符必 ...
- 'javac' 不是内部或外部命令,也不是可运行的程序
今天在命令行中运行javac命令时发现 但是运行java命令却可以 查找jdk的安装路径发现,安装目录里面同时有jdk的文件夹和jre的文件夹 查看了jdk的目录发现jdk目录中也有一个jre文件夹 ...
- 第二次项目冲刺(Beta版本)
第二次项目冲刺(Beta版本) 团队作业7--第二次项目冲刺(Beta版本)day1 http://www.cnblogs.com/wj946/p/8017787.html 团队作业7--第二次项目冲 ...
- eclipse 汉化详细方法
1.首先确认自己的 eclipse 是哪个版本,这个很关键,涉及到后面要用到的语言包需要与版本匹配,启动 eclipse,观察对应的版本号,比如我用的是 Photon 版本 2.参照官方给的方法进行下 ...
- [python] 统计某一路径下所有代码真实行数(空行已被过滤)
#-*- coding:utf-8 -*- ''' Created on 2018年8月15日 @author: anyd ''' import os list_line = [] filepat ...
- Python在自动化运维时经常会用到的方法
得到当前工作目录,即当前Python脚本工作的目录路径:os.getcwd() 返回指定目录下的所有文件和目录名:os.listdir() 函数用来删除一个文件:os.remove() 删除多个目录: ...
- Java之时间转换
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = sdf.parse( ...