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. Windows下使用Python的Curses库时 No module named _curses问题

    这个问题产生的 根本原因 是 curses 库不支持 windows.所以我们在下载完成python后(python 是自带 curses 库的),虽然在  python目录\Lib  中可以看到 c ...

  2. Jenkins Tomcat安装设置

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

  3. PHPCMS的产品筛选功能

    如下图所示功能: 首先,用下面这些代码替换掉phpcms/libs/functions/extention.func.php的内容 <?php /** * extention.func.php ...

  4. Openstack 10 云环境安装

    概述 资源规划 Undercloud Installation Overcloud Installation Trouble Shooting 附录 本指南介绍了如何使用 Red Hat OpenSt ...

  5. java处理大文本2G以上

    面试中经常碰到类似问题,问题的关键我觉得是用设置一个缓冲区 还有一个思路 是通过Linux split 命令将文件直接切割成小文件,再进行处理再汇总. 或者jdk7提供的 forkjoin 框架,利用 ...

  6. Github二次学习

    作者声明:本博客中所写的文章,都是博主自学过程的笔记,参考了很多的学习资料,学习资料和笔记会注明出处,所有的内容都以交流学习为主.有不正确的地方,欢迎批评指正. 本节课视频内容:https://www ...

  7. VisualSVN Server的配置和使用方法

    VisualSVN Server的配置和使用方法 VisualSVN Server的配置和使用方法[服务器端] 安装好VisualSVN Server后[安装过程看这里],运行VisualSVN Se ...

  8. git中的重要指令

    git命令 任何操作都需要以 git 命令为开头 本地操作: git init 初始化一个本地仓库 新建为 master主分支 git status 查看当前分支状态 git add <文件名& ...

  9. 第18次Scrum会议(10/30)【欢迎来怼】

    一.小组信息 队名:欢迎来怼小组成员队长:田继平成员:李圆圆,葛美义,王伟东,姜珊,邵朔,冉华 小组照片 二.开会信息 时间:2017/10/30 17:19~17:38,总计19min.地点:东北师 ...

  10. 02_Java基础_第2天(变量、运算符)_讲义

    今日内容介绍 1.变量 2.运算符 01变量概述 * A: 什么是变量? * a: 变量是一个内存中的小盒子(小容器),容器是什么?生活中也有很多容器, * 例如水杯是容器,用来装载水:你家里的大衣柜 ...