【BZOJ4514】【SDOI2016】数字配对 [费用流]
数字配对
Time Limit: 10 Sec Memory Limit: 128 MB
[Submit][Status][Discuss]
Description
Input
Output
一行一个数,最多进行多少次配对
Sample Input
2 4 8
2 200 7
-1 -2 1
Sample Output
HINT
n≤200,ai≤10^9,bi≤10^5,∣ci∣≤10^5
Solution
显然是一个费用流,并且这可以是一个二分图,由于 ai/aj 要是质数,那显然可以根据质因子个数的奇偶分类。
然后跑一跑最大费用最大流。判断一下值要>=0即可统计入答案。mmpBearChild查了一个下午错,发现是INF开小了qaq。
Code
#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<map>
using namespace std;
typedef long long s64; const int ONE = *;
const int INF = ; int n;
int a[ONE], b[ONE], c[ONE];
s64 dist[ONE];
int vis[ONE], q[ONE*], pre[ONE];
int first[ONE], go[ONE], next[ONE], pas[ONE], from[ONE], tot;
int pNum[ONE];
int odd[ONE],Onum, eve[ONE],Enum;
int S, T, Ans;
int prime[ONE], isp[ONE], p;
s64 Val, w[ONE]; int get()
{
int res=,Q=;char c;
while( (c=getchar())< || c> )
if(c=='-')Q=-;
res=c-;
while( (c=getchar())>= && c<= )
res=res*+c-;
return res*Q;
} void Getp(int MaxN)
{
for(int i=; i <= MaxN; i++)
{
if(!isp[i]) prime[++p] = i;
for(int j=; j <= prime[p], i*prime[j] <= MaxN; j++)
{
isp[i * prime[j]] = ;
if(i % prime[j] == ) break;
}
}
} int Factor(int x)
{
int res = ;
while(x != )
{
for(int i=; i<=p; i++)
if(x % prime[i] == )
{
x /= prime[i];
res++;
break;
}
}
return res;
} int PD(int x, int y)
{
if(x > y) swap(x, y);
if(x== || y== || y%x!=) return ;
x = y / x;
for(int i=; i<x; i++)
if(x % i == ) return ;
return ;
} int Add(int u, int v, int flow, s64 z)
{
next[++tot]=first[u]; first[u]=tot; go[tot]=v; pas[tot]=flow; w[tot]=z; from[tot]=u;
next[++tot]=first[v]; first[v]=tot; go[tot]=u; pas[tot]=; w[tot]=-z; from[tot]=v;
} bool Bfs()
{
for(int i=S; i<=T; i++) dist[i] = -1e18;
int tou = , wei = ;
q[] = S; vis[S] = ; dist[S] = ;
while(tou < wei)
{
int u = q[++tou];
for(int e=first[u]; e; e=next[e])
{
int v=go[e];
if(dist[v] < dist[u] + w[e] && pas[e])
{
dist[v] = dist[u] + w[e];
pre[v] = e;
if(!vis[v])
{
q[++wei] = v;
vis[v] = ;
}
}
}
vis[u] = ;
}
return dist[T] != -1e18;
} void Deal()
{
int x = INF;
for(int e=pre[T]; e; e=pre[from[e]]) x = min(x, pas[e]);
if(Val + dist[T] * x >= )
{
for(int e=pre[T]; e; e=pre[from[e]])
{
pas[e] -= x;
pas[((e-)^)+] += x;
}
Val += dist[T] * x;
Ans += x;
return;
}
printf("%d", Ans - Val / dist[T]);
exit();
} int main()
{
Getp(ONE);
n = get();
for(int i=; i<=n; i++) a[i] = get(), pNum[i] = Factor(a[i]);
for(int i=; i<=n; i++) b[i] = get();
for(int i=; i<=n; i++) c[i] = get(); S = ; T = n+;
for(int i=; i<=n; i++)
{
if(pNum[i] & ) Add(S,i, b[i],), odd[++Onum] = i;
else Add(i,T, b[i],), eve[++Enum] = i;
} for(int i=; i<=Onum; i++)
for(int j=; j<=Enum; j++)
{
int x = odd[i], y = eve[j];
if( PD(a[x], a[y]) )
Add(x,y, INF,(s64)c[x]*c[y]);
} while(Bfs()) Deal();
printf("%d", Ans - Val / dist[T]);
}
【BZOJ4514】【SDOI2016】数字配对 [费用流]的更多相关文章
- bzoj4514: [Sdoi2016]数字配对--费用流
看了一眼题目&数据范围,觉得应该是带下界的费用流 原来想拆点变成二分图,能配对的连边,跑二分图,可行性未知 后来看到另外一种解法.. 符合匹配要求的数要满足:质因子的个数相差为1,且两者可整除 ...
- 【BZOJ4514】[Sdoi2016]数字配对 费用流
[BZOJ4514][Sdoi2016]数字配对 Description 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ...
- BZOJ 4514: [Sdoi2016]数字配对 [费用流 数论]
4514: [Sdoi2016]数字配对 题意: 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数 ...
- BZOJ.4514.[SDOI2016]数字配对(费用流SPFA 二分图)
BZOJ 洛谷 \(Solution\) 很显然的建二分图后跑最大费用流,但有个问题是一个数是只能用一次的,这样二分图两部分都有这个数. 那么就用两倍的.如果\(i\)可以向\(j'\)连边,\(j\ ...
- 【BZOJ 4514】[Sdoi2016]数字配对 费用流
利用spfa流的性质,我直接拆两半,正解分奇偶(妙),而且判断是否整除且质数我用的是暴力根号,整洁判断质数个数差一(其他非spfa流怎么做?) #include <cstdio> #inc ...
- 4514: [Sdoi2016]数字配对 费用流
链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4514 思路 EK直接贪心做 <0的时候加上剩余返回 二分图a->b的时候 把b- ...
- BZOJ4514[Sdoi2016]数字配对——最大费用最大流
题目描述 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对,并获得 ci ...
- bzoj4514: [Sdoi2016]数字配对(费用流)
传送门 ps:费用流增广的时候费用和流量打反了……调了一个多小时 每个数只能参与一次配对,那么这就是一个匹配嘛 我们先把每个数分解质因数,记质因子总个数为$cnt_i$,那如果$a_i/a_j$是质数 ...
- [bzoj4514]数字配对[费用流]
今年SDOI的题,看到他们在做,看到过了一百多个人,然后就被虐惨啦... 果然考试的时候还是打不了高端算法,调了...几天 默默地yy了一个费用流构图: 源连所有点,配对的点连啊,所有点连汇... 后 ...
随机推荐
- 20145214实验一 Java开发环境的熟悉
20145214实验一 Java开发环境的熟悉 使用JDK编译.运行简单的java程序 命令行下程序开发 在命令行下建立20145214实验目录,进入该目录后创建exp1目录. 把代码保存到exp1目 ...
- spring 国际化i18n配置
i18n(其来源是英文单词 internationalization的首末字符i和n,18为中间的字符数)是“国际化”的简称.在资讯领域,国际化(i18n)指让产品(出版物,软件,硬件等)无需做大的改 ...
- 福州大学软工1816 | K班 第一次作业
(一)回想一下你初入大学时对计算机专业的畅想 (1)当初你是如何做出选择计算机专业的决定的? 本身对于计算机感兴趣.高考完之后翻了书,对于物理数学等基础学科兴趣不大,对金融等商科几乎毫无了解,再加上当 ...
- Java内存区域划分和GC机制
Java 内存区域和GC机制 目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况 Java GC(Ga ...
- html中图片自适应浏览器和屏幕,宽度高度自适应
1.(宽度自适应):在网页代码的头部,加入一行viewport元标签. <meta name="viewport" content="width=device-wi ...
- 解决chrome css本地映射不成功&&附带映射方法
解决办法:把本地文件夹名改成英文的(不要有中文) 顺便写一下怎么把在chrome调试的本地项目中的css映射到本地: 1.F12(option+command+i)启动chrome调试工具 2.打开s ...
- 火狐浏览器(FireFox)安装Flash插件失败处理方法
最近不知道怎么了,总是嫌弃IE,可能是被网络流量监测的网址给搞得了,弄了火狐浏览器,也安装了猎豹,这里不对浏览器做评价 好多朋友安装好火狐(FireFox)的时候发现之前不是有装IE的Flash播放插 ...
- CCleaner专业版注册码
下载软件安装之后: 1.断网 2.用户名:任意,注册码:C2YW-XZT7-A4SE-UD89-YZPC
- [OS] 操作系统常考知识点
转自:http://jennica.space/2017/03/21/os-principle/ 大纲如下: 1.操作系统概述2.操作系统运行环境3.进程线程模型4.处理器调度5.同步机制6.存储模型 ...
- codeforces 985 E. Pencils and Boxes (dp 树状数组)
E. Pencils and Boxes time limit per test 2 seconds memory limit per test 256 megabytes input standar ...