题意

在长度为 \(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\) 时间复杂度。

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define go(u) for(int i=head[u],v=e[i].to;i;i=e[i].last,v=e[i].to)
  4. #define rep(i,a,b) for(int i=a;i<=b;++i)
  5. #define pb push_back
  6. #define re(x) memset(x,0,sizeof x)
  7. typedef long long LL;
  8. inline int gi(){
  9. int x=0,f=1;char ch=getchar();
  10. while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
  11. while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-48;ch=getchar();}
  12. return x*f;
  13. }
  14. template<typename T>inline bool Max(T &a,T b){return a<b?a=b,1:0;}
  15. template<typename T>inline bool Min(T &a,T b){return b<a?a=b,1:0;}
  16. const int N=3007,inf=0x3f3f3f3f,Num=2e5;
  17. int n;
  18. int vis[200007],a[N],mark[N];
  19. namespace MF{
  20. int edc=1,S,T,ndc,sum;
  21. int dep[N],cur[N];
  22. struct edge{int to,cap,flow;}e[1000007];
  23. vector<int>G[N];
  24. void Add(int a,int b,int c){
  25. e[++edc]=(edge){b,c,0},G[a].push_back(edc);
  26. e[++edc]=(edge){a,0,0},G[b].push_back(edc);
  27. }
  28. bool bfs(){
  29. queue<int>Q;
  30. re(dep);re(cur);dep[S]=1,Q.push(S);
  31. while(!Q.empty()){
  32. int u=Q.front();Q.pop();
  33. for(int i=0;i<G[u].size();i++){
  34. edge &E=e[G[u][i]];
  35. if(E.cap>E.flow&&!dep[E.to])
  36. dep[E.to]=dep[u]+1,Q.push(E.to);
  37. }
  38. }
  39. return dep[T];
  40. }
  41. int dfs(int u,int b){
  42. if(u==T||!b) return b;
  43. int flow=0,f;
  44. for(int &i=cur[u];i<G[u].size();i++){
  45. edge &E=e[G[u][i]];
  46. if(dep[u]+1==dep[E.to]){
  47. f=dfs(E.to,min(b,E.cap-E.flow));
  48. flow+=f,E.flow+=f,b-=f,e[G[u][i]^1].flow-=f;
  49. if(!b) break;
  50. }
  51. }
  52. return flow;
  53. }
  54. int maxflow(){
  55. int res=0;
  56. while(bfs()) res+=dfs(S,inf);return res;
  57. }
  58. }
  59. int main(){
  60. #ifndef ONLINE_JUDGE
  61. #endif
  62. using namespace MF;
  63. n=gi();S=n+1,T=S+1;int cnt=0;
  64. for(int i=2;i<=Num;++i) if(!vis[i])
  65. for(int j=i+i;j<=Num;j+=i) vis[j]=1;
  66. bool fi=1;
  67. rep(i,1,n) {
  68. a[i]=gi();
  69. if(a[i]==1&&fi) fi=0;
  70. else if(a[i]==1) mark[i]=1,++cnt;
  71. }
  72. rep(i,1,n)if(a[i]&1&&!mark[i])
  73. rep(j,1,n)if(!mark[j]&&!(a[j]&1)&&!vis[a[i]+a[j]]) Add(i,j,1);
  74. rep(i,1,n) if(!mark[i]){
  75. if(a[i]&1) Add(S,i,1);
  76. else Add(i,T,1);
  77. }
  78. printf("%d\n",n-maxflow()-cnt);
  79. return 0;
  80. }

[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. LeetCode题解之Happy Number

    1.题目描述 2.题目分析 根据 happy number 的 性质,如果循环7次还没有到达 1,则这个数不是happy number . 3.代码 bool isHappy(int n) { ) r ...

  2. Sql Server 中如果使用TransactionScope开启一个分布式事务,使用该事务两个并发的连接会互相死锁吗

    提问: 如果使用TransactionScope开启一个分布式事务,使用该事务两个并发的连接会互相死锁吗? 如果在.Net中用TransactionScope开启一个事务. 然后在该事务范围内启动两个 ...

  3. SpringBoot_Mybatis_Maven_BootStrap

    ​​​ 需要eclipse 配置maven 未完,待续 链接:https://pan.baidu.com/s/1vej2zEdJmKeMUJD9S1B5MA 密码:y5j9

  4. Use Jupyter notebook on Fedora 28

    生产环境使用 Fedora 28, 并且需要搭建一个 Jupyter 的notebook 方便使用,所搭建的Jupyter 支持单人远程 密码访问 1. 安装 安装 Jupyter , 出错 [roo ...

  5. 【转】Zookeeper学习---zookeeper 选举机制介绍

    [原文]https://www.toutiao.com/i6593162565872779784/ zookeeper集群 配置多个实例共同构成一个集群对外提供服务以达到水平扩展的目的,每个服务器上的 ...

  6. 1.2环境的准备(二)之Pycharm的安装和使用

    目录: 1.Pycharm的安装 2.Pycharm的使用 (一)pycharm的安装: (1)官网下载:(分为两个版本,专业版和社区版,社区版就足够我们学习用的)https://www.jetbra ...

  7. beta冲刺————第三天(3/5)

    完善的具体内容: 前端: (1)可以进行修改文字大小背景 其中,金色的文字个人觉得很好看,点赞.(我很满意啊) (2)可以改变成夜间模式(也很不错啊) 后端: 尝试将本地的后端war文件,以及数据库传 ...

  8. [python] 列表解析式的高效与简洁

    方法一(列表解析式): list1 = ["abc","efg","hij"] list2 = [i[0] for i in list1] ...

  9. BZOJ3787:Gty的文艺妹子序列(分块,树状数组)

    Description Autumn终于会求区间逆序对了!Bakser神犇决定再考验一下他,他说道: “在Gty的妹子序列里,某个妹子的美丽度可也是会变化的呢.你还能求出某个区间中妹子们美丽度的逆序对 ...

  10. sql server 数据库作业备份存储过程

    DECLARE @fileName nvarchar(100) SET @fileName='D:\HFS\DataBase' + REPLACE(REPLACE(REPLACE(REPLACE(CO ...