4514: [Sdoi2016]数字配对

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 1870  Solved: 712
[Submit][Status][Discuss]

Description

有 n 种数字,第 i 种数字是 ai、有 bi 个,权值是 ci。

若两个数字 ai、aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数,

那么这两个数字可以配对,并获得 ci×cj 的价值。

一个数字只能参与一次配对,可以不参与配对。

在获得的价值总和不小于 0 的前提下,求最多进行多少次配对。

Input

第一行一个整数 n。

第二行 n 个整数 a1、a2、……、an。

第三行 n 个整数 b1、b2、……、bn。

第四行 n 个整数 c1、c2、……、cn。

Output

一行一个数,最多进行多少次配对

Sample Input

3
2 4 8
2 200 7
-1 -2 1

Sample Output

4

HINT

n≤200,ai≤10^9,bi≤10^5,∣ci∣≤10^5

emmm

每种数字看成点,拆点为xi,yi

S向xi连容量bi费用0的边,yi向T连容量bi费用0的边

如果两种数字u,v可以配对xu连yv,yu连xv容量均为inf,费用均为cu*cv

贪心跑最大费用,直到跑出来的费用为负,特判一波break掉

注意longlong

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cmath>
#define inf 0x3f3f3f3f
#define ll long long
#define N 405
using namespace std;
int n,m,tot,S,T,flow,hd[N],pre[N],a[N],vis[N];
ll cost,d[N];
struct edge{int u,v,next,cap;ll w;}e[N*N*2];
void adde(int u,int v,ll w,int c){
e[tot].v=v;
e[tot].u=u;
e[tot].w=w;
e[tot].next=hd[u];
e[tot].cap=c;
hd[u]=tot++;
}
struct ele{int a,b,c;}p[N];
bool cmp(ele a,ele b){return a.a>b.a;}
bool judge(int x){
int y=sqrt(x);
if(x<=1)return 0;
for(int i=2;i<=y;i++)
if(!(x%i))return 0;
return 1;
}
bool spfa(){
queue<int>q;ll t=(ll)inf*inf;
for(int i=S;i<=T;i++)d[i]=-t;d[S]=0;
memset(pre,-1,sizeof(pre));a[S]=1<<30;
q.push(S);
while(!q.empty()){
int u=q.front();q.pop();vis[u]=0;
for(int i=hd[u];~i;i=e[i].next){
int v=e[i].v;
if(e[i].cap&&d[v]<d[u]+e[i].w){
d[v]=d[u]+e[i].w;
pre[v]=i;
a[v]=min(a[u],e[i].cap);
if(vis[v])continue;
vis[v]=1;q.push(v);
}
}
}
if(d[T]==-t)return 0;
ll tmp=a[T]*d[T];
if(cost+tmp<0){
ll res=cost/d[T];
flow-=(int)res;
return 0;
}
flow+=a[T];cost+=(ll)a[T]*d[T];
int u=T;
while(u!=S){
e[pre[u]].cap-=a[T];
e[pre[u]^1].cap+=a[T];
u=e[pre[u]].u;
}
return 1;
}
int main(){
#ifdef wsy
freopen("pair4.in","r",stdin);
#else
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
#endif
memset(hd,-1,sizeof(hd));
scanf("%d",&n);
S=0;T=n*2+1;
for(int i=1;i<=n;i++)scanf("%d",&p[i].a);
for(int i=1;i<=n;i++)scanf("%d",&p[i].b);
for(int i=1;i<=n;i++)scanf("%d",&p[i].c);
sort(p+1,p+1+n,cmp);
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++){
if(p[i].a%p[j].a)continue;
if(!judge(p[i].a/p[j].a))continue;
adde(i,j+n,(ll)p[i].c*p[j].c,inf);
adde(j+n,i,(ll)p[i].c*p[j].c*(-1),0);
adde(j,i+n,(ll)p[i].c*p[j].c,inf);
adde(i+n,j,(ll)p[i].c*p[j].c*(-1),0);
}
for(int i=1;i<=n;i++){
adde(S,i,0,p[i].b);
adde(i,S,0,0);
adde(i+n,T,0,p[i].b);
adde(T,i+n,0,0);
}
while(spfa());
printf("%d",flow/2);
return 0;
}

bzoj4514的更多相关文章

  1. 【bzoj4514】 Sdoi2016—数字配对

    http://www.lydsy.com/JudgeOnline/problem.php?id=4514 (题目链接) 题意 n个数,每个数值为a[i],有b[i]个,权值为c[i].若两个数能配对当 ...

  2. 【bzoj4514】: [Sdoi2016]数字配对 图论-费用流

    [bzoj4514]: [Sdoi2016]数字配对 好像正常的做法是建二分图? 我的是拆点然后 S->i cap=b[i] cost=0 i'->T cap=b[i] cost=0 然后 ...

  3. 【BZOJ4514】[Sdoi2016]数字配对 费用流

    [BZOJ4514][Sdoi2016]数字配对 Description 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ...

  4. 【BZOJ4514】数字配对(费用流)

    题意: 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对,并获得 ci× ...

  5. bzoj-4514(网络流)

    题目链接: 4514: [Sdoi2016]数字配对 Description 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数 ...

  6. 【BZOJ-4514】数字配对 最大费用最大流 + 质因数分解 + 二分图 + 贪心 + 线性筛

    4514: [Sdoi2016]数字配对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 726  Solved: 309[Submit][Status ...

  7. BZOJ4514——[Sdoi2016]数字配对

    有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对,并获得 ci×cj 的 ...

  8. [bzoj4514]数字配对[费用流]

    今年SDOI的题,看到他们在做,看到过了一百多个人,然后就被虐惨啦... 果然考试的时候还是打不了高端算法,调了...几天 默默地yy了一个费用流构图: 源连所有点,配对的点连啊,所有点连汇... 后 ...

  9. bzoj4514: [Sdoi2016]数字配对--费用流

    看了一眼题目&数据范围,觉得应该是带下界的费用流 原来想拆点变成二分图,能配对的连边,跑二分图,可行性未知 后来看到另外一种解法.. 符合匹配要求的数要满足:质因子的个数相差为1,且两者可整除 ...

  10. bzoj4514 [Sdoi2016]数字配对

    Description 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对 ...

随机推荐

  1. bzoj 4373 算术天才⑨与等差数列

    4373: 算术天才⑨与等差数列 Time Limit: 10 Sec  Memory Limit: 128 MBhttp://www.lydsy.com/JudgeOnline/problem.ph ...

  2. 从Nest到Nesk -- 模块化Node框架的实践

    文: 达孚(沪江Web前端架构师) 本文原创,转至沪江技术 首先上一下项目地址(:>): Nest:https://github.com/nestjs/nest Nesk:https://git ...

  3. 如何书写高效的css样式

    如何书写高效的css样式? 有以下四个关键要素: 1.高效的css 2.可维护的css 3.组件化的css 4.hack-free  css 书写高效的css: 1.使用外联样式替代行间样式或内嵌样式 ...

  4. vue 中获取select 的option的value 直接click?

    我刚开始遇到这个问题的时候 直接用的click进行dom操作获取value 但是发现并灭有什么作用 问了旁边大神 才想起来还有change这个操作 于是乎 答案有了解决方案 1.在你的select中添 ...

  5. JQuery 动态加载iframe.

    html: <iframe id="ifm" style="width:inherit;height:inherit" runat="serve ...

  6. JAVA_SE基础——7.常量&变量

    上一篇,我讲了标识符&关键字    这篇我来解释下变量&常量~~~ 变量与常量这两个概念相信大家都不会感到陌生,在数学中就已经涉及了变量与常量.理解变量与常量,可以举这样一个例子: 例 ...

  7. pdf解析与结构化提取

    #PDF解析与结构化提取##PDF解析对于PDF文档,我们选择用PDFMiner对其进行解析,得到文本.###PDFMinerPDFMiner使用了一种称作lazy parsing的策略,只在需要的时 ...

  8. 儿童节,我们从零开始——Python入门资源推荐

    原创 2017-06-01 玄魂工作室 玄魂工作室 今天是六一儿童节,首先祝所有的小朋友身体健康,能永远生活在一个没有战争,没有压迫的世界里,永远快乐. 上一篇文章,很多人都对Python的各种书籍感 ...

  9. Mego开发文档 - 数据属性生成值

    数据属性生成值 该功能用于在数据插入或更新时为指定属性生成期望的值,Mego提供了非常灵活的实现方式以满足各种数据提交时的自动赋值问题. 生成值目的及模式 在Mego中生成值的目的一定是插入数据或更新 ...

  10. 在ABPZERO中,扩展实体的方法。

    内容 介绍 扩展的抽象实体 将新属性添加给用户 添加迁移 在界面上显示地址 在用户编辑/添加功能中添加地址 扩展的非抽象类实体 获得版本的派生实体 添加迁移 在界面上添加价格 在创建/编辑版本功能中加 ...