bzoj4514
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的更多相关文章
- 【bzoj4514】 Sdoi2016—数字配对
http://www.lydsy.com/JudgeOnline/problem.php?id=4514 (题目链接) 题意 n个数,每个数值为a[i],有b[i]个,权值为c[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 的倍数,且 ...
- 【BZOJ4514】数字配对(费用流)
题意: 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对,并获得 ci× ...
- bzoj-4514(网络流)
题目链接: 4514: [Sdoi2016]数字配对 Description 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数 ...
- 【BZOJ-4514】数字配对 最大费用最大流 + 质因数分解 + 二分图 + 贪心 + 线性筛
4514: [Sdoi2016]数字配对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 726 Solved: 309[Submit][Status ...
- BZOJ4514——[Sdoi2016]数字配对
有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对,并获得 ci×cj 的 ...
- [bzoj4514]数字配对[费用流]
今年SDOI的题,看到他们在做,看到过了一百多个人,然后就被虐惨啦... 果然考试的时候还是打不了高端算法,调了...几天 默默地yy了一个费用流构图: 源连所有点,配对的点连啊,所有点连汇... 后 ...
- bzoj4514: [Sdoi2016]数字配对--费用流
看了一眼题目&数据范围,觉得应该是带下界的费用流 原来想拆点变成二分图,能配对的连边,跑二分图,可行性未知 后来看到另外一种解法.. 符合匹配要求的数要满足:质因子的个数相差为1,且两者可整除 ...
- bzoj4514 [Sdoi2016]数字配对
Description 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对 ...
随机推荐
- iOS 播放音频的几种方法
Phone OS 主要提供以下了几种播放音频的方法: System Sound Services AVAudioPlayer 类 Audio Queue Services OpenAL 1. Syst ...
- php的set_time_limit()函数
set_time_limit(0); 括号里边的数字是执行时间,如果为零说明永久执行直到程序结束,如果为大于零的数字,则不管程序是否执行完成,到了设定的秒数,程序结束. 一个简单的例子,在网页里显示1 ...
- android 运行时异常捕获
1,将运行时异常捕获并存到手机SD卡上 可以直接使用logcat 命令Runtime.getRuntime().exec("logcat -f "+ file.getAbsolut ...
- Python内置函数(63)——property
英文文档: class property(fget=None, fset=None, fdel=None, doc=None) Return a property attribute. fget is ...
- 新概念英语(1-1)Excuse me!
Excuse me!Whose handbag is it? A:Excuse me! B:Yes? A:Is this your handbag? B:Pardon? A:Is this your ...
- Linux实战案例(4)CentOS清除用户登录记录和命令历史方法
CentOS清除用户登录记录和命令历史方法 清除登陆系统成功的记录[root@localhost root]# echo > /var/log/wtmp //此文件默认打开时乱码,可查到ip等信 ...
- nodejs(1-1)
http://www.runoob.com/nodejs/nodejs-tutorial.html
- GridControl的常用操作
1.GridView的回车跳转单元格和换行 private void gridView1_KeyPress(object sender, KeyPressEventArgs e) { ...
- 使用 Angular CLI 和 Webpack 分析包尺寸
使用 Angular CLI 和 Webpack 分析包尺寸 对于 Web app 来说,高性能总是最高优先级,对于 Angular 也不例外.但是随着应用复杂度的不断增长,我们如何才能知道哪些内容打 ...
- Java8新特性第2章(接口默认方法)
在Java中一个接口一旦发布就已经被定型,除非我们能够一次性的更新所有该接口的实现,否者在接口的添加新方法将会破坏现有接口的实现.默认方法就是为了解决这一问题的,这样接口在发布之后依然能够继续演化. ...