数字配对(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 的倍数,且 ...
随机推荐
- [转]精选!15个必备的VSCode插件
Visual Studio Code 是由微软开发的一款免费.跨平台的文本编辑器.由于其卓越的性能和丰富的功能,它很快就受到了大家的喜爱. 就像大多数 IDE 一样,VSCode 也有一个扩展和主题市 ...
- DS06--图
一.学习总结 1.图的思维导图 2.图学习体会 深度优先遍历与广度优先遍历 不同点:广度优先搜索,适用于所有情况下的搜索,但是深度优先搜索不一定能适用于所有情况下的搜索.因为由于一个有解的问题树可能含 ...
- 如何通过JAVA让DB2调用操作系统命令
引言:我们在工作中常用操作系统命令和DB2命令对数据库做数据的导入.导出等操作,但是DB2不支持复合SQL 语句调用操作系统命令,因此我们需要利用 UDF 来执行SQL 中不可用的操作(例如:执行一些 ...
- Visual C++ 8.0对象布局
哈哈,从M$ Visual C++ Team的Andy Rich那里又偷学到一招:VC8的隐含编译项/d1reportSingleClassLayout和/d1reportAllClassLayout ...
- so加载报错:dlopen failed: couldn't map ... Permission denied
转自:https://blog.csdn.net/u013270444/article/details/60869376 问题描述: 我的应用当中集成了一个安全相关的sdk,而这个sdk中使用的so是 ...
- django里的http协议
一个普通的user Begin########## ['__class__', '__delattr__', '__dict__', '__doc__', '__eq__', '__format__' ...
- JavaScript常用方法(工具类的封装)
日期格式化 function formatDateTime(timeStamp) { var date = new Date(); date.setTime(timeStamp); var y = d ...
- 【JavaScript&jQuery】前端资源大全
综合类 综合类 地址 前端知识体系 http://www.cnblogs.com/sb19871023/p/3894452.html 前端知识结构 https://github.com/Jackson ...
- 洛谷 P1352 没有上司的舞会
树形动规入门题 先放题面 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都 ...
- java学习5-jar包的下载以及导入
1.出现未导入包的情况 ,表示当前jdk不 2.百度下载jar包 3.File. 未完待续http://blog.csdn.net/a153375250/article/details/5085104 ...