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 ...
 
随机推荐
- TCP三次握手是什么?为什么要进行三次握手?两次,四次握手可以吗?
			
1.第一次握手,发送SYN报文,传达信息:“你好,我想建立连接”: 第二次握手,回传SYN+ACK报文,传达信息:“好的,可以建立链接”: 第三次握手,回传ACK报文,传到信息:“好的,我知道了 ...
 - J2EE企业级应用架构发展
			
一. 准备工作 1. 本文参考 J2EE企业级应用架构 二. 架构发展 1. 原始版 用户+服务器[单台虚拟机]+数据库[mysql或者oracle],用户访问量比较少. 特点:单节点[只有一台机器] ...
 - lua模块化
			
main.lua local main = require("my") main.greeting() my.lua local foo = {} local function g ...
 - Leet Palindrome Partitioning II
			
class Solution { public: int minCut(string s) { int len = s.length(); ]; char* s_dp = new char[len * ...
 - Yii  时间戳格式化显示的问题
			
这个控件是CJuiDatePicker控件的扩展,支持时分秒. 下载地址:http://www.yiiframework.com/extension/timepicker/ 这个控件用在view里的_ ...
 - 【PyQt5 学习记录】006:重写窗口事件及QMessageBox
			
#!/usr/bin/env python import sys from PyQt5.QtWidgets import (QApplication, QMainWindow, QMessageBox ...
 - vue-router 实现导航守卫(路由卫士)
			
路由跳转前做一些验证,比如登录验证,是网站中的普遍需求. 对此,vue-route 提供的 beforeRouteUpdate 可以方便地实现导航守卫(navigation-guards). 导航守卫 ...
 - CSS - 伪类和伪元素的区别
			
伪类和伪元素皆独立于文档结构.它们获取元素的途径也不是基于id.class.属性这些基础的元素特征,而是在处于特殊状态的元素(伪类),或者是元素中特别的内容(伪元素).区别总结如下: CSS伪类 (P ...
 - 网络I/O模型--05多路复用I/O
			
多路复用I/O模型在应用层工作效率比我们俗称的 BIO 模型快的本质原因是,前者不再使用操作系统级别的“同步 I/O”模型 . 在 Linux 操作系统环境下, 多路复用 I/O 模型就是技术人员通常 ...
 - RESTful API的十个最佳实践
			
WebAPI在过去几年里非常的盛行,我们很多以往的技术手段都慢慢的转换为使用WebAPI来开发,因为它的语法简单规范化,以及轻量级等特点,这种方式收到了广泛的推崇. 通常我们使用RESTFul(Rep ...