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. Flask 文件和流

    当我们要往客户端发送大量的数据比较好的方式是使用流,通过流的方式来将响应内容发送给客户端,实现文件的上传功能,以及如何获取上传后的文件. 响应流的生成 Flask响应流的实现原理就是通过Python的 ...

  2. bzoj千题计划217:bzoj2333: [SCOI2011]棘手的操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=2333 读入所有数据,先模拟一遍所有的合并操作 我们不关心联通块长什么样,只关心联通块内有谁 所以可以 ...

  3. .Net Core SignalR 实时推送信息

    以前一直没用成功过SignalR(.net asp),最近几天又参考了对应的文档,最终调成功啦. 开始之前,应该注意: 一定要.Net Core 2.1.0以上的SDK. VS2017 15.6以上的 ...

  4. 使用C#开发Android应用之WebApp

    近段时间了解了一下VS2017开发安卓应用的一些技术,特地把C#开发WebApp的一些过程记录下来, 欢迎大家一起指教.讨论,废话少说,是时候开始表演真正的技术了.. 1.新建空白Android应用 ...

  5. Spring Cache扩展:注解失效时间+主动刷新缓存(二)

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  6. PAT1048. Find Coins(01背包问题动态规划解法)

    问题描述: Eva loves to collect coins from all over the universe, including some other planets like Mars. ...

  7. Python内置函数(62)——exec

    英文文档: exec(object[, globals[, locals]]) This function supports dynamic execution of Python code. obj ...

  8. Zookeeper分布式服务协调组件

    1.简介 Zookeeper是一个分布式服务协调组件,是Hadoop.Hbase.Kafka的重要组件,它是一个为分布式应用提供一致性服务的组件.   Zookeeper的目标就是封装好复杂易出错的服 ...

  9. js中的caller属性和callee属性

    应该用"属性"来称呼caller和callee,而不是方法. caller:返回调用当前函数的函数的引用.a调用b,则返回a(a是boss,因为a把b叫过去干活了): callee ...

  10. SpringBoot(二):设置springboot同一接口程序启动入口

    根据上一篇文章中搭建了一个springboot简单工程,在该工程中编写HelloWordController.java接口类,并在该类中写了一个main函数,做为该类的接口服务启动入口.此时如果新增多 ...