p4068 [SDOI2016]数字配对
分析
我们考虑对所有a[i]质因数分解,然后记cnt[i]为a[i]是由几个质数相乘得到的
然后我们建一个二分图,左面为所有cnt[i]为奇数的点,右面是为偶数的点
我们从源点向左面点连容量b[i]花费0的边,从右面点向汇点连容量b[i]花费0的边
然后两排点之间符合条件的点对连容量inf花费c[i]*c[j]的边
然后跑总花费不小于0的最大费用最大流即可
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
#define int long long
const int inf = 1e15+;
int n,a[],b[],C[],cnt[];
int x[],y[],l1,l2,s,t,Ans,now,sum;
int head[],w[],c[],nxt[],to[];
int fm[],ano[],S;
inline void add(int x,int y,int z,int cost){
nxt[++S]=head[x];head[x]=S;to[S]=y;w[S]=z;c[S]=cost;fm[S]=x;
nxt[++S]=head[y];head[y]=S;to[S]=x;w[S]=;c[S]=-cost;fm[S]=y;
ano[S]=S-;ano[S-]=S;
}
inline int work(int x){
int i,j,k=;
for(i=;i<=sqrt(x);i++)
while(x%i==)x/=i,k++;
if(x>)k++;
return k;
}
queue<int>q;
int iq[],nf[],la[],d[];
inline void go(){
int i,j,k;
la[s]=;
while(){
for(i=;i<=t;i++)d[i]=-inf;
q.push(s);
d[s]=,nf[s]=inf,iq[s]=;
while(!q.empty()){
int u=q.front();
q.pop(),iq[u]=;
for(i=head[u];i;i=nxt[i])
if(w[i]&&d[to[i]]<d[u]+c[i]){
d[to[i]]=d[u]+c[i];
la[to[i]]=i;
nf[to[i]]=min(w[i],nf[u]);
if(!iq[to[i]]){
q.push(to[i]);
iq[to[i]]=;
}
}
}
int be=now,ans=Ans,i=la[t];
if(!nf[t]||d[t]==-inf)return;
while(i){
w[i]-=nf[t];
w[ano[i]]+=nf[t];
now+=nf[t]*c[i];
i=la[fm[i]];
}
Ans+=nf[t];
if(now<){
Ans=ans+be/abs(d[t]);
return;
}
}
}
signed main(){
int i,j,k;
scanf("%lld",&n);
s=n+,t=n+;
for(i=;i<=n;i++)scanf("%lld",&a[i]),cnt[i]=work(a[i]);
for(i=;i<=n;i++)scanf("%lld",&b[i]);
for(i=;i<=n;i++)scanf("%lld",&C[i]);
for(i=;i<=n;i++)if(cnt[i]&)
for(j=;j<=n;j++)
if((cnt[i]==cnt[j]+&&a[i]%a[j]==)
||(cnt[j]==cnt[i]+&&a[j]%a[i]==))add(i,j,inf,C[i]*C[j]);
for(i=;i<=n;i++)
if(cnt[i]&)add(s,i,b[i],);
else add(i,t,b[i],);
go();
printf("%lld\n",Ans);
return ;
}
p4068 [SDOI2016]数字配对的更多相关文章
- Luogu P4068 [SDOI2016]数字配对
反正现在做题那么少就争取做一题写一题博客吧 看到题目发现数字种类不多,而且结合价值的要求可以容易地想到使用费用流 但是我们如果朴素地建图就会遇到一个问题,若\(i,j\)符合要求,那么给\(i,j\) ...
- 图论(费用流):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 是一个质数 ...
- 【bzoj4514】: [Sdoi2016]数字配对 图论-费用流
[bzoj4514]: [Sdoi2016]数字配对 好像正常的做法是建二分图? 我的是拆点然后 S->i cap=b[i] cost=0 i'->T cap=b[i] cost=0 然后 ...
- BZOJ 4514: [Sdoi2016]数字配对
4514: [Sdoi2016]数字配对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1606 Solved: 608[Submit][Statu ...
- 【BZOJ4514】[Sdoi2016]数字配对 费用流
[BZOJ4514][Sdoi2016]数字配对 Description 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ...
- BZOJ4514——[Sdoi2016]数字配对
有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对,并获得 ci×cj 的 ...
- bzoj4514 [Sdoi2016]数字配对
Description 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对 ...
- BZOJ4514[Sdoi2016]数字配对——最大费用最大流
题目描述 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对,并获得 ci ...
随机推荐
- python-Django初体验
1.搭建Django开发环境 2.创建工程与应用 CentOS6.5环境下 Python 2.6 ipython 1.2.1 Django 1.6.5 pip install -y django == ...
- hihocoder 1049 后序遍历树
#include<cstdio> #include<cstdlib> #include<iostream> #include<cstring> #inc ...
- OpenCV - opencv3 图像处理 之 图像缩放( python与c++实现 )
转自:https://www.cnblogs.com/dyufei/p/8205121.html 一. 主要函数介绍 1) 图像大小变换 cvResize () 原型: voidcvResize(co ...
- pdp 的连接方法
<?php $dsn = "mysql:host=127.0.0.1;dbname=blog_edu"; try{ $pdo = new PDO($dsn,'root','' ...
- Java 输入参数并求和
题目要求: 输入若干的参数,编写一个程序求出参数的和: 程序流程: 代码: 例子:
- CodeSmith 基本语法(二)
CodeSmith之四 - 典型实例(四) CodeSmith API文档 (三) CodeSmith 基本语法(二) CodeSmith 图形界面基本操作(一) CodeSmith的C#语法与Asp ...
- 学习动态性能表(9)--v$filestat
学习动态性能表 第九篇--V$FILESTAT 2007.6.5 本视图记录各文件物理I/O信息.如果瓶颈与I/O相关,可用于分析发生的活动I/O事件.V$FILESTAT显示出数据库I/O的下列信 ...
- Xml日志记录文件最优方案(附源代码)
Xml作为数据存储的一种方式,当数据非常大的时候,我们将碰到很多Xml处理的问题.通常,我们对Xml文件进行编辑的最直接的方式是将xml文件加载到XmlDocument,在内存中来对XmlDocume ...
- SQL SERVER存储过程的几种示例
1.常用系统存储过程及使用语法:exec sp_databases; --查看数据库exec sp_tables; --查看表exec sp_columns student;--查看列exec sp_ ...
- extjs控制器调用其他视图的函数实现控件赋值。