Codeforces Gym 104059B - Breeding Bugs
简要题意
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的更多相关文章
- Codeforces Gym 101252D&&floyd判圈算法学习笔记
一句话题意:x0=1,xi+1=(Axi+xi%B)%C,如果x序列中存在最早的两个相同的元素,输出第二次出现的位置,若在2e7内无解则输出-1. 题解:都不到100天就AFO了才来学这floyd判圈 ...
- Codeforces Gym 101190M Mole Tunnels - 费用流
题目传送门 传送门 题目大意 $m$只鼹鼠有$n$个巢穴,$n - 1$条长度为$1$的通道将它们连通且第$i(i > 1)$个巢穴与第$\left\lfloor \frac{i}{2}\rig ...
- Codeforces Gym 101623A - 动态规划
题目传送门 传送门 题目大意 给定一个长度为$n$的序列,要求划分成最少的段数,然后将这些段排序使得新序列单调不减. 考虑将相邻的相等的数缩成一个数. 假设没有分成了$n$段,考虑最少能够减少多少划分 ...
- 【Codeforces Gym 100725K】Key Insertion
Codeforces Gym 100725K 题意:给定一个初始全0的序列,然后给\(n\)个查询,每一次调用\(Insert(L_i,i)\),其中\(Insert(L,K)\)表示在第L位插入K, ...
- 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 ...
- codeforces gym 100553I
codeforces gym 100553I solution 令a[i]表示位置i的船的编号 研究可以发现,应是从中间开始,往两边跳.... 于是就是一个点往两边的最长下降子序列之和减一 魔改树状数 ...
- CodeForces Gym 100213F Counterfeit Money
CodeForces Gym题目页面传送门 有\(1\)个\(n1\times m1\)的字符矩阵\(a\)和\(1\)个\(n2\times m2\)的字符矩阵\(b\),求\(a,b\)的最大公共 ...
- Codeforces GYM 100876 J - Buying roads 题解
Codeforces GYM 100876 J - Buying roads 题解 才不是因为有了图床来测试一下呢,哼( 题意 给你\(N\)个点,\(M\)条带权边的无向图,选出\(K\)条边,使得 ...
- codeforces Gym 100187J J. Deck Shuffling dfs
J. Deck Shuffling Time Limit: 2 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/pro ...
- Codeforces Gym 100187K K. Perpetuum Mobile 构造
K. Perpetuum Mobile Time Limit: 2 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/pro ...
随机推荐
- JSP中request对象的简单实用,实现简单的注册以及个人信息的展示
JSP中Request对象的使用 概述:request对象主要用于接收客户端发送来的请求信息,客户端的请求信息被封装在request对象中,通过它可以了解到客户的需求,然后做出响应.主要封装了用户提交 ...
- 齐博x2向上滚动特效
要实现图中圈起来的向上滚动特效,大家可以参考下面的代码 <!--滚动开始--> <style type="text/css"> .auto-roll{ he ...
- 使用 StringUtils.split 的坑
点赞再看,动力无限. 微信搜「程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章. 在日常的 Java 开发中,由于 J ...
- 如何在Spring Boot开启事务
说到事务,那什么是事务呢? 事务(Transaction),一般是指要做的或所做的事情. 原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行. ...
- pod(七):静态pod
目录 一.系统环境 二.前言 三.静态pod 3.1 何为静态pod 3.2 创建静态pod 3.2.1 使用--pod-manifest-path指定静态pod目录 3.2.2 静态pod默认目录/ ...
- Golang 和 Python 随机生成N位字符串
Golang: func RandomString(n int) string { var letters = []byte("ABCDEFGHIGKLMNOPQRSTUVWXYZabcde ...
- LabVIEW+OpenVINO在CPU上部署新冠肺炎检测模型实战
前言 之前博客:[YOLOv5]LabVIEW+OpenVINO让你的YOLOv5在CPU上飞起来给大家介绍了在LabVIEW上使用openvino加速推理,在CPU上也能感受丝滑的实时物体识别.那我 ...
- 嵌入式-C语言基础:函数指针
定义函数地址:如果在程序中定义了一个函数,那么在编译的时候,编译系统为函数代码分配一段存储空间,这段存储空间的起始地址(也叫入口地址)称为这个函数的地址. 和数组一样,数组名代表地址,而函数名表示函数 ...
- 7 款殿堂级的开源 CMS(内容管理系统)
最近,有读者留言让我推荐开源 CMS.我本想直接回复 WordPress,但是转念一想我玩 WordPress 是 2010 年左右的事情了,都过去十年了,它会不会有些过时呢?有没有新的.更好玩的开源 ...
- SpringCloud——Eureka Feign Ribbon Hystrix Zuul等关键组件的学习与记录
SpringCloud--Eureka Feign Ribbon Hystrix Zuul等关键组件的学习与记录 前言:本篇是对近日学习狂神SpringCloud教程之后的感想和总结,鉴于对Sprin ...