Fox
Portal --> broken qwq
Description
有n只狐狸在一起聚餐,每只狐狸都有一个年龄。按照狐狸们的习惯,坐在一起的两只狐狸的年龄之和需要是质数。现在这些狐狸们在一些圆桌上吃晚餐(第一只和最后一只狐狸是相邻的),每个圆桌至少做3只狐狸,至多没有限制,现在请你找到一种方案使得狐狸们的座位满足它们的习俗。
如果有多种方案同时满足,输出任意一种
数据范围:n<=200 年龄<=10000 ,保证有解
Solution
首先质数我们可以预处理
注意到一点:从奇偶性来看,一桌狐狸要么一定是一奇一偶这样来坐的(一桌数量为偶数),要么一定是两个\(1\)连着坐在一起,其他都是一奇一偶(一桌数量为奇数)
因为奇数+奇数或者偶数+偶数得到的都是偶数,而唯一的偶数素数是\(2=1+1\)
然后我们稍微处理一下这两种情况,考虑从桌子的某一个地方断开,把一个环变成一个序列这样:一奇一偶的情况随意,怎么断都是一奇一偶,第二种情况则从两个\(1\)那里断开,变成一个\(1\)开头,\(1\)结尾的序列
然后我们将狐狸按照年龄的奇偶性分组,很容易转化成一个匹配的问题,那么考虑用网络流来求解
我们考虑将源点与奇数的狐狸相连,边的容量为\(2\)(因为每只奇数狐狸要与两只偶数狐狸相邻),然后奇数偶数狐狸之间的连容量为\(1\)的边,直接暴力\(n^2\)枚举是否能够组成素数,素数列表用线性筛预处理出来,最后偶数狐狸与汇点相连,同理边的容量为\(2\)
这样跑完一遍最大流之后,我们沿着满流的边走就能够构造出一组解了
至于为什么的话。。首先这是最大匹配,如果说有解的话一定跑出来的是一种每一只奇数狐狸都与两只偶数狐狸相邻的情况,然后具体构造的时候我们考虑dfs,每次走满流的边,并且每次肯定都是从奇数狐狸走到偶数狐狸或者反过来,满足我们上面拆成序列之后的性质
代码大概长这个样子
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;
const int N=210,M=N*N+N,inf=2147483647;
struct xxx{
int y,nxt,r;
}a[M*2];
queue<int> q;
int h[N],lv[N];
int isnp[20010],p[20010],age[N];
int vis[N];
vector<int> rec[N];
int n,m,tot,num,S,T;
void add(int x,int y,int r){
//printf("%d %d %d\n",x,y,r);
a[++tot].y=y; a[tot].nxt=h[x]; h[x]=tot; a[tot].r=r;
a[++tot].y=x; a[tot].nxt=h[y]; h[y]=tot; a[tot].r=0;
}
bool bfs(){
while (!q.empty()) q.pop();
for (int i=S;i<=T;++i) lv[i]=0;
int u,v;
q.push(S); lv[S]=1;
while (!q.empty()){
v=q.front(); q.pop();
for (int i=h[v];i!=-1;i=a[i].nxt){
u=a[i].y;
if (!a[i].r||lv[u]) continue;
lv[u]=lv[v]+1;
q.push(u);
if (u==T) return true;
}
}
return false;
}
int dfs(int v,int o){
if (!o||v==T) return o;
int u,flow,ret=0;
for (int i=h[v];i!=-1;i=a[i].nxt){
u=a[i].y;
if (!a[i].r||lv[u]!=lv[v]+1) continue;
flow=dfs(u,min(o,a[i].r));
if (flow){
o-=flow;
ret+=flow;
a[i].r-=flow;
a[i^1].r+=flow;
if (!o) break;
}
}
if (!ret) lv[v]=-1;
return ret;
}
int dinic(){
int ret=0;
while (bfs()) ret+=dfs(S,inf);
return ret;
}
void prework(int n){
int cnt=0;
for (int i=2;i<=n;++i){
if (!isnp[i]) p[++cnt]=i;
for (int j=1;j<=cnt&&i*p[j]<=n;++j){
isnp[i*p[j]]=true;
if (i%p[j]==0) break;
}
}
}
void build(){
memset(h,-1,sizeof(h));
tot=-1;
S=0; T=n+1;
for (int i=1;i<=n;++i)
if (age[i]%2) add(S,i,2);
else add(i,T,2);
for (int i=1;i<=n;++i){
if (age[i]%2==0) continue;
for (int j=1;j<=n;++j){
if (i==j||age[j]%2) continue;
if (!isnp[age[i]+age[j]]) add(i,j,1);
}
}
}
void get_ans(int x){
rec[num].push_back(x); vis[x]=true;
int u;
for (int i=h[x];i!=-1;i=a[i].nxt){
u=a[i].y;
if (vis[u]||u==S||u==T) continue;
if (((age[x]%2)&&(!a[i].r))||((age[x]%2==0)&&(!a[i^1].r)))
get_ans(u);
}
}
void solve(){
memset(vis,0,sizeof(vis));
for (int i=1;i<=n;++i)
if (!vis[i]){
++num;
get_ans(i);
}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
#endif
int tmp;
scanf("%d",&n);
for (int i=1;i<=n;++i) scanf("%d",age+i);
prework(20000);
build();
tmp=dinic();
solve();
printf("%d\n",num);
for (int i=1;i<=num;++i){
tmp=rec[i].size();
printf("%d ",tmp);
for (int j=0;j<tmp;++j) printf("%d ",rec[i][j]);
printf("\n");
}
}
/*
input
24
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
output
3
6 1 2 3 6 5 4
10 7 8 9 12 15 14 13 16 11 10
8 17 18 23 22 19 20 21 24
*/
Fox的更多相关文章
- [DFNews] Fire-Eye与Fox IT联合推出Cryptolocker解锁网站
Cryptolocker是臭名昭著的勒索程序,使用AES加密后密钥回传,用户除了缴纳赎金之外基本无法解密数据. 近日,知名安全公司Fire-Eye与Fox IT联合推出了针对该勒索程序的解锁网站 ht ...
- 在线教学、视频会议 Webus Fox(1)文本、语音、视频聊天及电子白板基本用法
Webus Fox是基于网页的在线教学.视频会议软件,不用安装,直接使用.它提供文本.语音.视频聊天,文件共享.电子白板等功能. 1. 登录 访问 http://flash.webus.cn/#,用自 ...
- CF 371B Fox Dividing Cheese[数论]
B. Fox Dividing Cheese time limit per test 1 second memory limit per test 256 megabytes input standa ...
- 2076 Problem F Quick Brown Fox
题目描述 A pangram is a phrase that includes at least one occurrence of each of the 26 letters, ‘a’. . . ...
- 在线教学、视频会议 Webus Fox(2) 服务端开发手册
上次在<在线教学.视频会议软件 Webus Fox(1)文本.语音.视频聊天及电子白板基本用法>里介绍了软件的基本用法.本文主要介绍服务器端如何配置.开发. 1. 配置 1.1 IIS配置 ...
- 在线教学、视频会议 Webus Fox(3) 客户端开发手册
本文主要介绍webus fox 客户端的配置及接口说明. 1. 文件列表和配置 1.1 文件列表 1.2 common.xml 配置 根据服务器端的部署, 替换[ServerUrl] , [RtmpP ...
- Codeforces Round #218 (Div. 2) B. Fox Dividing Cheese
B. Fox Dividing Cheese time limit per test 1 second memory limit per test 256 megabytes input standa ...
- Codeforces Round #290 (Div. 2) D. Fox And Jumping dp
D. Fox And Jumping 题目连接: http://codeforces.com/contest/510/problem/D Description Fox Ciel is playing ...
- Codeforces Round #290 (Div. 2) C. Fox And Names dfs
C. Fox And Names 题目连接: http://codeforces.com/contest/510/problem/C Description Fox Ciel is going to ...
- Codeforces Round #290 (Div. 2) B. Fox And Two Dots dfs
B. Fox And Two Dots 题目连接: http://codeforces.com/contest/510/problem/B Description Fox Ciel is playin ...
随机推荐
- JMeter自学笔记1-环境安装
一.写在前面的话: Jmeter是一款优秀的开源测试工具, 是每位测试工程师进阶过程中,需要熟悉并掌握的一款测试工具,熟练使用Jmeter能大大提高工作效率. Jmeter环境安装需要依赖JDK,所以 ...
- [T-ARA][HUE]
歌词来源:http://music.163.com/#/song?id=22704406 wa du seu mo geum to yo do ga tae 어딜가도 스페셜한게 없어 [eo-dil ...
- Fedora 28 UEFI模式安装过程记录
这次的折腾是个意外.不过还是要记录一下. 多次做启动盘,把U盘做坏了.将U盘用量产工具修复以后就能做启动盘了.从官网下了Fedora 28的镜像(与CentOS同属RedHat系,尽量与鸟哥一致),用 ...
- SpringMVC Controller介绍及常用注解——@Controller
一 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model ...
- 大数据-spark-hbase-hive等学习视频资料
不错的大数据spark学习资料,连接过期在评论区评论,再给你分享 https://pan.baidu.com/s/1ts6RNuFpsnc39tL3jetTkg
- ES6的新特性(8)——数组的扩展
数组的扩展 扩展运算符 含义 扩展运算符(spread)是三个点(...).它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列. console.log(...[1, 2, 3]) / ...
- UML设计(团队作业6)
决胜 Poker 一.团队成员 学号 姓名 211606392 郑俊瑜 (队长) 211606327 冉繁盛 211606323 刘世华 211606386 姚皓钰 211606358 陈卓楠 211 ...
- Programming Protocol-Independent Packet Processors
引言 OpenFlow协议固定的包头域数目,使得南向协议过于死板. P4可以实现自定义包头,增加灵活性. P4是OpenFlow未来发展的方向. We propose P4 as a strawman ...
- 【线段树求区间第一个不大于val的值】Lpl and Energy-saving Lamps
https://nanti.jisuanke.com/t/30996 线段树维护区间最小值,查询的时候优先向左走,如果左边已经找到了,就不用再往右了. 一个房间装满则把权值标记为INF,模拟一遍,注意 ...
- Spring – 缓存注解
Spring缓存抽象概述 Spring框架自身并没有实现缓存解决方案,但是从3.1开始定义了org.springframework.cache.Cache和org.springframework.ca ...