数字配对(bzoj 4514)
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
/*
这道题本来打算写50分,结果只得了30分,第二部分的自己YY的网络流写错了,原因是没注意要可以转成二分图。
根据题意,如果我们把a[i]质因数分解,那么如果x,y能够建边,那么它们分解出来的个数一定相差1,这样就转成了二分图。
至于题目要求的保证费用要大于等于0,也就是越大越好,我们可以将费用变负,然后跑最小费用,每次增广保证费用不大于0。
*/
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#define N 210
#define lon long long
#define inf 1000000000000000LL
using namespace std;
int n,S,T,cnt=,tot,totx,toty,ans;
int a[N],b[N],head[N],fa[N],prime[],fx[N],fy[N];
lon c[N],dis[N];int inq[N],f[];
struct node{
int u,v,f,pre;lon c;
};node e[N*N];
bool judge(int x,int y){
if(!x||!y) return false;
if(x<y) swap(x,y);
if(x%y!=) return false;
x/=y;
for(int i=;i<=tot;i++){
if(prime[i]>=x) break;
if(x%prime[i]==) return false;
}
return true;
}
void add(int u,int v,int f,lon c){
e[++cnt].u=u;e[cnt].v=v;e[cnt].f=f;e[cnt].c=-c;e[cnt].pre=head[u];head[u]=cnt;
e[++cnt].u=v;e[cnt].v=u;e[cnt].f=;e[cnt].c=c;e[cnt].pre=head[v];head[v]=cnt;
}
bool spfa(){
queue<int> q;
memset(inq,,sizeof(inq));
for(int i=S;i<=T;i++) dis[i]=inf;
dis[S]=;inq[S]=;q.push(S);
while(!q.empty()){
int u=q.front();q.pop();inq[u]=;
for(int i=head[u];i;i=e[i].pre){
int v=e[i].v;
if(e[i].f&&dis[v]>dis[u]+e[i].c){
dis[v]=dis[u]+e[i].c;fa[v]=i;
if(!inq[v]){
q.push(v);inq[v]=;
}
}
}
}
return dis[T]!=inf;
}
void min_cost(){
lon cost=;
while(spfa()){
int tmp=;
for(int i=fa[T];i;i=fa[e[i].u])
tmp=min(tmp,e[i].f);
if(cost+dis[T]*tmp<=){
cost+=dis[T]*tmp;ans+=tmp;
for(int i=fa[T];i;i=fa[e[i].u])
e[i].f-=tmp,e[i^].f+=tmp;
}
else {//这个地方不是很懂
ans-=(cost/dis[T]);
return;
}
}
}
int main(){
freopen("menci_pair.in","r",stdin);
freopen("menci_pair.out","w",stdout);
scanf("%d",&n);
S=;T=n+;
for(int i=;i<=n;i++)scanf("%d",&a[i]);
for(int i=;i<=n;i++)scanf("%d",&b[i]);
for(int i=;i<=n;i++)scanf("%lld",&c[i]);
for(int i=;i<=;i++){
if(!f[i]) prime[++tot]=i;
for(int j=;j<=tot;j++){
if(i*prime[j]>) break;
f[i*prime[j]]=;
if(i%prime[j]==) break;
}
}
for(int i=;i<=n;i++){
int tmp=a[i],num=;
for(int j=;j<=tot;j++){
while(tmp%prime[j]==) tmp/=prime[j],num++;
if(tmp==) break;
}
if(num&) fx[++totx]=i;
else fy[++toty]=i;
}
for(int i=;i<=totx;i++)
for(int j=;j<=toty;j++)
if(judge(a[fx[i]],a[fy[j]]))
add(fx[i],fy[j],,c[fx[i]]*c[fy[j]]);
for(int i=;i<=totx;i++) add(S,fx[i],b[fx[i]],);
for(int i=;i<=toty;i++) add(fy[i],T,b[fy[i]],);
min_cost();
printf("%d",ans);
return ;
}
数字配对(bzoj 4514)的更多相关文章
- AC日记——[Sdoi2016]数字配对 bzoj 4514
4514 思路: 很受伤现在,,测了那么多次不过的原因就是因为INF不够大: 解法有两种: 解法1: 把n个点按照质因数个数为奇或偶分为两个点集(很容易就可以想到): 然后,按照题目连边跑最大费用流: ...
- 图论(费用流):BZOJ 4514 [Sdoi2016]数字配对
4514: [Sdoi2016]数字配对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 820 Solved: 345[Submit][Status ...
- BZOJ 4514: [Sdoi2016]数字配对 [费用流 数论]
4514: [Sdoi2016]数字配对 题意: 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数 ...
- BZOJ 4514: [Sdoi2016]数字配对
4514: [Sdoi2016]数字配对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1606 Solved: 608[Submit][Statu ...
- 【BZOJ-4514】数字配对 最大费用最大流 + 质因数分解 + 二分图 + 贪心 + 线性筛
4514: [Sdoi2016]数字配对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 726 Solved: 309[Submit][Status ...
- SDOI 2016 数字配对
题目大意:给定n个数字以及每个数字的个数和权值,将满足条件的数字配对,使得总代价不小于0,且配对最多 最大费用最大流拆点,对于每个点,连一条由S到该点的边,容量为b,花费为0,再连一条到T的边 对于每 ...
- [SDOI2016 Round1] 数字配对
COGS 2221. [SDOI2016 Round1] 数字配对 http://www.cogs.pro/cogs/problem/problem.php?pid=2221 ★★★ 输入文件:m ...
- 【BZOJ4514】【SDOI2016】数字配对 [费用流]
数字配对 Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 有 n 种数字,第 i 种数字是 ...
- 【bzoj4514】: [Sdoi2016]数字配对 图论-费用流
[bzoj4514]: [Sdoi2016]数字配对 好像正常的做法是建二分图? 我的是拆点然后 S->i cap=b[i] cost=0 i'->T cap=b[i] cost=0 然后 ...
- 【BZOJ4514】[Sdoi2016]数字配对 费用流
[BZOJ4514][Sdoi2016]数字配对 Description 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ...
随机推荐
- Beta阶段第三次网络会议
Beta阶段第三次网络会议 第二次会议问题解决情况 不同等级城堡不同图片,移动动画解决,阴影效果添加 小地图信息添加城堡和士兵信息 新AI设计失败,在存在科技树的情况下,如果将所有可能操作全部纳入考虑 ...
- 软件定义网络(SDN)研究进展
写在前面 这是我入门SDN以来的第一篇论文,它是一篇中文综述,看起来相对容易.也让我对SDN有了进一步的认识.下面是我的一些心得. 全文框架 SDN 将数据平面与控制平面解耦合,简化了网络管理. SD ...
- Opendarlight Carbon 安装
写在前面 目前最轻松的一次安装过程,感谢大翔哥的帮助. 安装过程 1.Zip包下载 找到Opendaylight官网,进入下载界面找到Carbon版本并下载. 2.Zip包解压 把这个zip压缩包解压 ...
- 周总结<3>
经过了一周的学习,我们在html以及C语言方面又有的新的知识点的学习,包括计算机导论也学会了路由器的设置. html 鼠标事件 C 二叉树的遍历代码 计算机导论 路由器的设置 Html案例: < ...
- 搜索引擎Elasticsearch REST API学习
Elasticsearch为开发者提供了一套基于Http协议的Restful接口,只需要构造rest请求并解析请求返回的json即可实现访问Elasticsearch服务器.Elasticsearch ...
- 【final】评价①
飞天小女警添加猜你喜欢功能,个人很喜欢.当推荐产品不喜欢的时候还有其他的选择,很人性化. 金州勇士将管理人员的角色分开,使整个系统的分工更明确,也更清晰. 新蜂的俄罗斯方块随着等级的提升有直观的颜色变 ...
- 超强汇总!110 道 Python 面试笔试题
https://mp.weixin.qq.com/s/hDQrimihoaHSbrtjLybZLA 今天给大家分享了110道面试题,其中大部分是巩固基本python知识点,希望刚刚入手python,对 ...
- SDOI2017 解题报告
数字表格 \(T\)次询问,每次给出\(n,m(n,m\le 10^6)\),\(f\)为斐波那契数列,\(f_0=0,f_1=1\),求: \[ \prod _{i=1}^n\prod _{j=1} ...
- 【bzoj3560】DZY Loves Math V 欧拉函数
题目描述 给定n个正整数a1,a2,…,an,求 的值(答案模10^9+7). 输入 第一行一个正整数n. 接下来n行,每行一个正整数,分别为a1,a2,…,an. 输出 仅一行答案. 样例输入 3 ...
- http://www.pythonchallenge.com/ 网站题解
在知乎中无意发现了这个网站,做了几题发现挺有趣的,这里记录下自己的解题思路,顺便对比下答案中的思路 网页:http://www.pythonchallenge.com/ 目前只做了几题,解题的方法就是 ...