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的更多相关文章

  1. [DFNews] Fire-Eye与Fox IT联合推出Cryptolocker解锁网站

    Cryptolocker是臭名昭著的勒索程序,使用AES加密后密钥回传,用户除了缴纳赎金之外基本无法解密数据. 近日,知名安全公司Fire-Eye与Fox IT联合推出了针对该勒索程序的解锁网站 ht ...

  2. 在线教学、视频会议 Webus Fox(1)文本、语音、视频聊天及电子白板基本用法

    Webus Fox是基于网页的在线教学.视频会议软件,不用安装,直接使用.它提供文本.语音.视频聊天,文件共享.电子白板等功能. 1. 登录 访问 http://flash.webus.cn/#,用自 ...

  3. CF 371B Fox Dividing Cheese[数论]

    B. Fox Dividing Cheese time limit per test 1 second memory limit per test 256 megabytes input standa ...

  4. 2076 Problem F Quick Brown Fox

    题目描述 A pangram is a phrase that includes at least one occurrence of each of the 26 letters, ‘a’. . . ...

  5. 在线教学、视频会议 Webus Fox(2) 服务端开发手册

    上次在<在线教学.视频会议软件 Webus Fox(1)文本.语音.视频聊天及电子白板基本用法>里介绍了软件的基本用法.本文主要介绍服务器端如何配置.开发. 1. 配置 1.1 IIS配置 ...

  6. 在线教学、视频会议 Webus Fox(3) 客户端开发手册

    本文主要介绍webus fox 客户端的配置及接口说明. 1. 文件列表和配置 1.1 文件列表 1.2 common.xml 配置 根据服务器端的部署, 替换[ServerUrl] , [RtmpP ...

  7. 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 ...

  8. 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 ...

  9. 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 ...

  10. 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 ...

随机推荐

  1. Jenkins Tomcat安装设置

    Jenkins Tomcat安装设置 以下为必须满足Jenkins Tomcat设置的先决条件. 第1步:验证安装Java 要验证Java安装,打开控制台并执行以下Java命令. OS 任务 命令 W ...

  2. hbase和ZooKeeper集群安装配置

    一:ZooKeeper集群安装配置 1:解压zookeeper-3.3.2.tar.gz并重命名为zookeeper. 2:进入~/zookeeper/conf目录: 拷贝zoo_sample.cfg ...

  3. 【转】: 塞尔达组在GDC2017演讲的文字翻译:显示的力量

      塞尔达系列推出新作的时候,美术风格都有明显变化.本作的风格比起写实,笔触轻快变化幅度大是其特征.2011年公开的技术演示中,画面风格要更加写实.最终版则更接近于卡通.5年里到底发生了什么呢? ▲2 ...

  4. 使用Idea工具创建Maven WebApp项目

    (1)New Project,选择模板,配置SDK (2)配置项目名及项目组名 GroupID是项目组织唯一的标识符, 比如我的项目叫test001 那么GroupID应该是 com.lixiaomi ...

  5. Windows操作系统C盘占用空间过多

    Windows操作系统C盘占用空间过多 大部分的windows电脑用户在长时间使用PC时都会遇到一个问题,就是C盘占用的空间会越来越多,乃至占满整个C盘. 后来在百度了一波,发现各种方法都试过了,也不 ...

  6. 最大公共子串:DP

    标题:最大公共子串 最大公共子串长度问题就是:求两个串的所有子串中能够匹配上的最大长度是多少. 比如:"abcdkkk" 和 "baabcdadabc",可以找 ...

  7. PHP学习和使用总结

    起因 学习和使用PHP也有不少年头了,而自己也在学习和使用其他许多语言.我想通过这个总结来给自己一个交代.另一方面也分享一下开发经验,如何用PHP开发和管理大型的项目. 闲聊 许多人说自己1天学会PH ...

  8. 第三次ScrumMeeting博客

    第三次ScrumMeeting博客 本次会议于10月27日(五)22时整在3公寓725房间召开,持续10分钟. 与会人员:刘畅.方科栋.窦鑫泽.张安澜. 1. 每个人的工作(有Issue的内容和链接) ...

  9. postman的巨坑 之 cookie

    问题描述:一个后端接口,该接口需要校验登录态,登录态通过cookie中的一个传参k判断.在保证登录的前提下,调用机器A上的接口一直报“用户未登录”,调机器B上就没问题,于是开始排查问题. 解决过程: ...

  10. (Miller Rabin算法)判断一个数是否为素数

    1.约定 x%y为x取模y,即x除以y所得的余数,当x<y时,x%y=x,所有取模的运算对象都为整数. x^y表示x的y次方.乘方运算的优先级高于乘除和取模,加减的优先级最低. 见到x^y/z这 ...