4514: [Sdoi2016]数字配对
Description
有 n 种数字,第 i 种数字是 ai、有 bi 个,权值是 ci。
若两个数字 ai、aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数,
那么这两个数字可以配对,并获得 ci×cj 的价值。
一个数字只能参与一次配对,可以不参与配对。
在获得的价值总和不小于 0 的前提下,求最多进行多少次配对。
对于满足条件的\(a_i/a_j\)一定要满足\(a_i\)的质因子个数比\(a_j\)大一
所以可以对于每个数的质因子个数建二分图,只有异侧才有连边
至于总价值不小于0,在总价值<0的时候停止就行了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
#include<algorithm>
#define M 1000001
#define LL long long
using namespace std;
LL t,n,m,k,a[M],b[M],c[M],edge[M],nex[M],head[M],ver[M],cnt=1,h[M],d[M],cs[M],inq[M],cur[M],w[M],e[M],ed,zz,ans;
queue <LL> q;
void add(LL x,LL y,LL z,LL co)
{
ver[++cnt]=y; nex[cnt]=head[x]; head[x]=cnt; edge[cnt]=z; cs[cnt]=co;
ver[++cnt]=x; nex[cnt]=head[y]; head[y]=cnt; edge[cnt]=0; cs[cnt]=-co;
}
bool spfa()
{
memset(d,0,sizeof(d));
memcpy(cur, head, sizeof(head));
while(q.size()) q.pop();
memset(h,-0x3f,sizeof(h));
q.push(0); d[0]=1; h[0]=0;
while(q.size())
{
LL x=q.front(); q.pop(); inq[x]=0;
for(LL i=head[x];i;i=nex[i])
if(edge[i] && h[ver[i]]<h[x]+cs[i])
{
h[ver[i]]=h[x]+cs[i]; d[ver[i]]=d[x]+1;
if(!inq[ver[i]]) q.push(ver[i]);
inq[ver[i]]=1;
}
}
if(d[t]) return 1;
return 0;
}
LL dinic(LL x,LL flow)
{
if(!flow || x==t) return flow;
LL re=flow, k;
for(LL & i=cur[x];i && re;i=nex[i])
if(edge[i] && h[ver[i]]==h[x]+cs[i] && d[ver[i]]==d[x]+1)
{
k=dinic(ver[i],min(re, edge[i]));
re-=k; edge[i]-=k; edge[i^1]+=k;
}
return flow-re;
}
LL fj(LL x)
{
if(x==1) return 0;
LL k=sqrt(x),ans=0; k+=1;
for(LL i=2;i<=k;i++) if(x%i==0) while(x%i==0) x/=i,ans+=1;
if(x!=1) ans+=1;
return ans;
}
int main()
{
scanf("%lld",&n); t=n+1;
for(LL i=1;i<=n;i++) scanf("%lld",&a[i]);
for(LL i=1;i<=n;i++) scanf("%lld",&b[i]);
for(LL i=1;i<=n;i++) scanf("%lld",&c[i]);
for(LL i=1;i<=n;i++)
w[i]=fj(a[i]);
for(LL i=1;i<=n;i++) if(w[i]%2)
for(LL j=1;j<=n;j++) if(w[j]%2==0 && ((a[i]%a[j]==0 && w[i]==w[j]+1)||(a[j]%a[i]==0 && w[j]==w[i]+1)))
add(i,j,0x3f3f3f3f,c[i]*c[j]);
for(LL i=1;i<=n;i++) if(w[i]%2) add(0,i,b[i],0);
else add(i,t,b[i],0);
while(spfa())
{
bool bll=1;
while(k=dinic(0,0x3f3f3f3f))
{
if(ed+h[t]*k<0)
{ans+=ed/(-h[t]); bll=0; break;}
ed+=h[t]*k, ans+=k;
}
if(!bll) break;
}
printf("%lld",ans);
}
4514: [Sdoi2016]数字配对的更多相关文章
- 图论(费用流):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 ...
- 4514: [Sdoi2016]数字配对 费用流
链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4514 思路 EK直接贪心做 <0的时候加上剩余返回 二分图a->b的时候 把b- ...
- BZOJ.4514.[SDOI2016]数字配对(费用流SPFA 二分图)
BZOJ 洛谷 \(Solution\) 很显然的建二分图后跑最大费用流,但有个问题是一个数是只能用一次的,这样二分图两部分都有这个数. 那么就用两倍的.如果\(i\)可以向\(j'\)连边,\(j\ ...
- 【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 的倍数,且 ...
- AC日记——[Sdoi2016]数字配对 bzoj 4514
4514 思路: 很受伤现在,,测了那么多次不过的原因就是因为INF不够大: 解法有两种: 解法1: 把n个点按照质因数个数为奇或偶分为两个点集(很容易就可以想到): 然后,按照题目连边跑最大费用流: ...
- 【BZOJ 4514】[Sdoi2016]数字配对 费用流
利用spfa流的性质,我直接拆两半,正解分奇偶(妙),而且判断是否整除且质数我用的是暴力根号,整洁判断质数个数差一(其他非spfa流怎么做?) #include <cstdio> #inc ...
随机推荐
- zookeeper watcher
ZooKeeper 的 watcher 机制主要包括客户端线程.客户端 WatchManager 和 ZooKeeper 服务器三部分. 工作方式:客户端在向 zk 服务器注册 Watcher 的同 ...
- IDEA 中将已有项目放到 GitHub 上去
前言:公司用的都是 idea+svn 来管理代码,所以家里尝试一下 idea+github 来管理.我的本地仓库是配置过ssh key,所以此处没有再次配置ssh key,如需配置可以参考 https ...
- Android 使用全局变量的问题
现在每天都在忙,而且一忙起来,就把写笔记的事情放在了后面,最近在写程序的时候,突然要使用全局变量,就按照以前的方式,写了一个类,然后把变量都声明为静态变量,然后做为全局变量使用,但是在进行Activi ...
- 在MyBatis中查询数据、涉及多参数的数据访问操作、插入数据时获取数据自增长的id、关联表查询操作、动态SQL、关于配置MyBatis映射没有代码提示的解决方案
1. 单元测试 在单元测试中,每个测试方法都需要执行相同的前置代码和后置代码,则可以自定义2个方法,分别在这2个方法中执行前置代码和后置代码,并为这2个方法添加@Before和@After注解,然后, ...
- scss-!optional
optional翻译成汉语具有"可选的"的意思.顾名思义,!optional标记前面的扩展不必须生成一个新的选择器.看一段SCSS代码片段: p{ color:red; @exte ...
- 黑客之google入侵网站常用方式 2
一: 在搜索框上输入: “index of/ ” inurl:lib 再按搜索你将进入许多图书馆,并且一定能下载自己喜欢的书籍. 在搜索框上输入: “index of /” cnki 再按搜索你就可以 ...
- CentOS7.4 + Hadoop2.9安装配置管理(分布式)
1. 规划 1.1. 机器列表 NameNode SecondaryNameNode DataNodes 192.168.1.121 192.168.1.122 192.168.1.101 192 ...
- ArcGIS10.3+Oracle12C+ArcGIS Server10.3安装布署(之二)
1.创建PDB 输入 dbca 命令 2.安装完成后,连接PDBSDE的容器数据库 3.环境变量 从Oracle的官方网站下载 instantclient-basic-nt-12.1.0.2.0. ...
- 分布式文件系统比较出名的有HDFS 和 GFS
分布式文件系统比较出名的有HDFS 和 GFS,其中HDFS比较简单一点.本文是一篇描述非常简洁易懂的漫画形式讲解HDFS的原理.比一般PPT要通俗易懂很多.不难得的学习资料. 1.三个部分: 客户 ...
- LeetCode 之Find Minimum in Rotated Sorted Array
1.题目描述 2.题目分析 对该问题,要找最小元,可以从后向前遍历,只要前一个元素大于当前元素,说明当前元素就是最小元. 3.代码 int findMin(vector<int>& ...