简要题意

Virtual Judge 传送门 | Codeforces Gym 传送门

给出一个长度为 \(n\) 的序列 \(a\),你需要从中选出一些数,使其两两相加不为质数。输出最大可以选择多少个数。

\(1 \leq n \lt 750,1 \leq a_i \lt 10^7\)

思路

Imakf 学长推荐的题。

首先我们发现,如果对于任意两个数 \(a_i,a_j\),如果 \((a_i+a_j)\in\mathbb{P}\),连边 \((i,j)\)。然后答案就是图的最大独立集。但是一般图最大独立集是 NP-Complete 问题,目前没有多项式时间复杂度解法。

考虑到若 \(a_i,a_j\neq 1\),那么若 \((a_i+a_j)\in\mathbb{P}\),则 \(a_i\bmod 2\neq b_i\bmod 2\)。则若满足上述条件连边,就一定得到的是二分图。

好,然后跑二分图最大匹配,最后将二分图最大匹配转换成二分图最大独立集即可。

等一下,\(a_i=a_j=1\) 的问题我们没有解决,由于如果独立集中有两个及以上 \(1\) 就一定会有质数和出现(\(1+1=2,2\in\mathbb{P}\)),所以我们对值为 \(1\) 的 \(a_i\) 去重即可。

使用匈牙利算法求解二分图最大匹配,时间复杂度均摊 \(O(\max a+n\cdot\frac{n^2}{\log n})\)(这个复杂度是我用素数定理乱算的),理论复杂度上界 \(O(\max a+n^3)\)。可以通过本题。

(思路不难,细节贼多)

代码

#include <bits/stdc++.h>
#define int long long
using namespace std; int pri[20000005];
bool vis[20000005];
int tot; int n,p[800]; struct edge{
int nxt,to;
} g[10000005];
int head[800],ec;
void add(int u,int v){
g[++ec].nxt=head[u];
g[ec].to=v;
head[u]=ec;
} int vist[800],mch[800];
bool hungry(int u,int tag){
if(vist[u]==tag) return false;
vist[u]=tag;
for(int i=head[u];i;i=g[i].nxt){
int v=g[i].to;
if(mch[v]==0||hungry(mch[v],tag)){
mch[v]=u;
return true;
}
}
return false;
} signed main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n;
vis[1]=1;vis[0]=1;
for(int i=2;i<=(2e7);i++){
if(!vis[i]){
pri[++tot]=i;
}
for(int j=1;j<=tot&&i*pri[j]<=(2e7);j++){
vis[i*pri[j]]=1;
if(!(i%pri[j]))break;
}
}
for(int i=1;i<=n;i++) cin>>p[i];
sort(p+1,p+n+1, greater<int>());
if(p[n]==1){
while(p[n]==1) n--;
n++;
}
for(int i=1;i<=n;i++){
if(!(p[i]&1)) continue;
for(int j=1;j<=n;j++){
if((p[j]&1)) continue;
if(!vis[p[i]+p[j]]) {
add(i,j);
}
}
}
int ret=0;
for(int i=1;i<=n;i++){
if(hungry(i,i)) ret++;
}
cout<<(n-ret);
}

AC Record on Virtual Judge | Codeforces Gym AC 记录 ID:\(188853866\)

Codeforces Gym 104059B - Breeding Bugs的更多相关文章

  1. Codeforces Gym 101252D&&floyd判圈算法学习笔记

    一句话题意:x0=1,xi+1=(Axi+xi%B)%C,如果x序列中存在最早的两个相同的元素,输出第二次出现的位置,若在2e7内无解则输出-1. 题解:都不到100天就AFO了才来学这floyd判圈 ...

  2. Codeforces Gym 101190M Mole Tunnels - 费用流

    题目传送门 传送门 题目大意 $m$只鼹鼠有$n$个巢穴,$n - 1$条长度为$1$的通道将它们连通且第$i(i > 1)$个巢穴与第$\left\lfloor \frac{i}{2}\rig ...

  3. Codeforces Gym 101623A - 动态规划

    题目传送门 传送门 题目大意 给定一个长度为$n$的序列,要求划分成最少的段数,然后将这些段排序使得新序列单调不减. 考虑将相邻的相等的数缩成一个数. 假设没有分成了$n$段,考虑最少能够减少多少划分 ...

  4. 【Codeforces Gym 100725K】Key Insertion

    Codeforces Gym 100725K 题意:给定一个初始全0的序列,然后给\(n\)个查询,每一次调用\(Insert(L_i,i)\),其中\(Insert(L,K)\)表示在第L位插入K, ...

  5. Codeforces gym 101343 J.Husam and the Broken Present 2【状压dp】

     2017 JUST Programming Contest 2.0 题目链接:Codeforces gym 101343 J.Husam and the Broken Present 2 J. Hu ...

  6. codeforces gym 100553I

    codeforces gym 100553I solution 令a[i]表示位置i的船的编号 研究可以发现,应是从中间开始,往两边跳.... 于是就是一个点往两边的最长下降子序列之和减一 魔改树状数 ...

  7. CodeForces Gym 100213F Counterfeit Money

    CodeForces Gym题目页面传送门 有\(1\)个\(n1\times m1\)的字符矩阵\(a\)和\(1\)个\(n2\times m2\)的字符矩阵\(b\),求\(a,b\)的最大公共 ...

  8. Codeforces GYM 100876 J - Buying roads 题解

    Codeforces GYM 100876 J - Buying roads 题解 才不是因为有了图床来测试一下呢,哼( 题意 给你\(N\)个点,\(M\)条带权边的无向图,选出\(K\)条边,使得 ...

  9. codeforces Gym 100187J J. Deck Shuffling dfs

    J. Deck Shuffling Time Limit: 2   Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/pro ...

  10. Codeforces Gym 100187K K. Perpetuum Mobile 构造

    K. Perpetuum Mobile Time Limit: 2 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/pro ...

随机推荐

  1. JSP中使用response对象实现定时跳转网页

    5秒后跳转到登录页面 <% response.setHeader("refresh","5;URL="login.jsp"); %>

  2. golang中的errgroup

    0.1.索引 https://waterflow.link/articles/1665239900004 1.串行执行 假如我们需要查询一个课件列表,其中有课件的信息,还有课件创建者的信息,和课件的缩 ...

  3. python基础之标识符、注释与变量

    一.注释 1.作用:注释是用来解释和说明代码的. 2.分类:注释可以分为单行注释和多行注释 2.1.单行注释:在编写的代码或文字前加上"#",表示单行注释 1 #我是单行注释 2 ...

  4. 深入理解独占锁ReentrantLock类锁

    ReentrantLock介绍 [1]ReentrantLock是一种基于AQS框架的应用实现,是JDK中的一种线程并发访问的同步手段,它的功能类似于synchronized是一种互斥锁,可以保证线程 ...

  5. Mysql InnoDB Redo log

    一丶什么是redo innodb是以也为单位来管理存储空间的,增删改查的本质都是在访问页面,在innodb真正访问页面之前,需要将其加载到内存中的buffer pool中之后才可以访问,但是在聊事务的 ...

  6. 云原生之旅 - 8)云原生时代的网关 Ingress Nginx

    前言 当我们在Kubernetes部署的服务需要暴露给外部用户使用时,有三种选择:LoadBalancer,NodePort, Ingress. LoadBalancer类型得结合各个Cloud Pr ...

  7. Oracle收集统计信息的一些思考

    一.问题 Oracle在收集统计信息时默认的采样比例是DBMS_STATS.AUTO_SAMPLE_SIZE,那么AUTO_SAMPLE_SIZE的值具体是多少? 假设采样比例为10%,那么在计算单个 ...

  8. ElasticSearch深度分页详解

    1 前言 ElasticSearch是一个实时的分布式搜索与分析引擎,常用于大量非结构化数据的存储和快速检索场景,具有很强的扩展性.纵使其有诸多优点,在搜索领域远超关系型数据库,但依然存在与关系型数据 ...

  9. Windows自带管理工具

    exe类notepad 记事本 control 控制面板 mstsc 远程桌面连接explorer 资源管理器 taskmgr 任务管理器resmon 资源监视器 perfmon 性能监视器reged ...

  10. i春秋wanna to see your hat?

    打开题目网页发现是个选择帽子的网页,点击超链接进入一个网页让我们输入我们的name然后匹配帽子颜色(其实不管怎么填都是绿色的)这里也有个注册窗口 先查看源码没什么特别发现,再试试抓包吧 在这个界面抓包 ...