[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有浪漫关系则连边,如此构造二分图,答案显然就是最大 ...
随机推荐
- Forbidden Attack:7万台web服务器陷入被攻击的险境
一些受VISA HTTPS保护的站点,因为存在漏洞容易受到Forbidden攻击,有将近70,000台服务器处于危险之中. 一种被称为"Forbidden攻击"的新攻击技术揭露许多 ...
- Oracle EBS INV 创建物料搬运单头
CREATE OR REPLACE PROCEDURE XX_CreateMoveOrderHeader AS -- Common Declarations l_api_version NUMBER ...
- python自学——集合
#皇城根儿#集合:是无序的.不重复的:1.去重:2.关系测试#创建集合#创建数字集合number=set([1,3,5,7,9]) #数字型集合str_type=set(["im" ...
- innodb_file_per_table - 转换为InnoDB
共享InnoDB / var / lib / mysql / ibdata1存储的问题InnoDB表当前将数据和索引存储到共享表空间(/ var / lib / mysql / ibdata1).由于 ...
- Cisco ASA 使用ASDM 配置管理口 方法
CISCO ASA防火墙ASDM安装和配置 准备一条串口线一边接台式机或笔记本一边接防火墙的CONSOLE 接口,通过CRT或者超级终端连接ASA在用ASDM图形管理界面之前须在串口下输入一些命令开启 ...
- ETL技巧应用(高级应用介绍:准备区运用、 时间戳的运用、日志表的运用、使用调度)
1.1 准备区运用 a.在构建数据仓库时,数据源位于一服务器上,数据仓库在另一服务器端,数据源Server端访问频繁,并且数据量大,需要不断更新, b.建立准备区数据库: >将数据抽取到准 ...
- Rarfile解压不了的问题
最近用python调用rarfile进行解压rar压缩包时,报了如下错误: rarfile.RarCannotExec: Unrar not installed? (rarfile.UNRAR_TOO ...
- Spark 集群搭建
0. 说明 Spark 集群搭建 [集群规划] 服务器主机名 ip 节点配置 s101 192.168.23.101 Master s102 192.168.23.102 Worker s103 19 ...
- 题解 P1034 【矩形覆盖】
题面 在平面上有n个点(n≤50),每个点用一对整数坐标表示.例如:当n=4时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4(0,7),见图一. 这些点可以用k个矩形(1≤ ...
- div+css ie6图片之间有间隙的问题
图片转换为快级元素就解决了 img{display:block;} 也可设置img属性img{vertical-align:top;}