bzoj4514: [Sdoi2016]数字配对--费用流
看了一眼题目&数据范围,觉得应该是带下界的费用流
原来想拆点变成二分图,能配对的连边,跑二分图,可行性未知
后来看到另外一种解法。。
符合匹配要求的数要满足:质因子的个数相差为1,且两者可整除
因此筛完素数、分解质因子,记录质因子的个数
奇数个分为一类,偶数个分为一类,那么连边一定是奇数向偶数才可以连,而其中能整除的且商为质数的连边
然后源点向奇数的点连边,偶数的点向汇点连边,跑费用流
至于下界,我们先把权值取负
由于是求最小费用,那么当求得费用刚好大于0时
上一次刚好小于零的费用流就是最终的流
答案就是上一次的流量
程序写的不是很简洁。。有些细节比如要开LL值得注意= =
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<vector>
#include<queue>
#define LL long long
#define INF 0x7fffffff
#define maxe 40000*2+10
#define maxn 1000
using namespace std;
struct node{
int from,to,flow,next;
LL cost;
}e[maxe];
int ans,cnt,head[maxn],pre[maxn],vis[maxn];
],odd[maxn],even[maxn];
LL c[maxn],sum,dis[maxn];
vector<int> prime;
void insert(int u, int v, int f, LL c){
e[++cnt].from=u;
e[cnt].to=v;
e[cnt].flow=f;
e[cnt].cost=c;
e[cnt].next=head[u];
head[u]=cnt;
e[++cnt].from=v;
e[cnt].to=u;
e[cnt].flow=;
e[cnt].cost=-c;
e[cnt].next=head[v];
head[v]=cnt;
}
void init(){
scanf("%d", &n);
; i<=n; i++) scanf("%d", &a[i]);
; i<=n; i++) scanf("%d", &b[i]);
; i<=n; i++) scanf("%lld", &c[i]);
}
bool judge(int i, int j){
;
int tmp=max(a[i]/a[j], a[j]/a[i]);
; k<prime.size(); k++)
if (prime[k]>=tmp) break;
) ;
;
}
void get_prime(){
memset(notprime,,sizeof(notprime));
; i<=; i++)
if (!notprime[i]){
prime.push_back(i);
; j+=i)
notprime[j]=;
}
}
void build(){
odd[]=even[]=;
; i<=n; i++){
;
; j<prime.size(); j++){
int tmp=a[i];
) tmp/=prime[j],sum++;
}
) odd[++odd[]]=i;
]]=i;
}
cnt=-;
memset(head,-,sizeof(head));
memset(e,,sizeof(e));
; i<=odd[]; i++)
; j<=even[]; j++)
if (judge(odd[i], even[j]))
insert(odd[i],even[j],INF,-c[odd[i]]*c[even[j]]);
s=n+; t=n+;
; i<=odd[]; i++)
insert(s,odd[i],b[odd[i]],);
; i<=even[]; i++)
insert(even[i],t,b[even[i]],);
}
bool spfa(){
memset(pre,-,sizeof(pre));
memset(dis,,sizeof(dis));
queue<int> Q;
Q.push(s);
dis[s]=; vis[s]=;
while (!Q.empty()){
int now=Q.front();
Q.pop();
vis[now]=;
; i=e[i].next){
int v=e[i].to;
&& dis[v]>dis[now]+e[i].cost){
dis[v]=dis[now]+e[i].cost;
pre[v]=i;
if (!vis[v]){
vis[v]=;
Q.push(v);
}
}
}
}
) ; ;
}
bool flow(){
int f=INF;
; i=pre[e[i^].to]) f=min(f,e[i].flow);
){
; i=pre[e[i^].to]){
e[i].flow-=f; e[i^].flow+=f;
}
sum+=dis[t]*f;
ans+=f;
;
}
else{
ans-=(sum/dis[t]);
;
}
}
void work(){
ans=; sum=;
while (spfa() && flow());
printf("%d\n", ans);
}
int main(){
get_prime();
init();
build();
work();
;
}
bzoj4514: [Sdoi2016]数字配对--费用流的更多相关文章
- 【BZOJ4514】[Sdoi2016]数字配对 费用流
[BZOJ4514][Sdoi2016]数字配对 Description 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ...
- BZOJ 4514: [Sdoi2016]数字配对 [费用流 数论]
4514: [Sdoi2016]数字配对 题意: 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数 ...
- BZOJ.4514.[SDOI2016]数字配对(费用流SPFA 二分图)
BZOJ 洛谷 \(Solution\) 很显然的建二分图后跑最大费用流,但有个问题是一个数是只能用一次的,这样二分图两部分都有这个数. 那么就用两倍的.如果\(i\)可以向\(j'\)连边,\(j\ ...
- 【BZOJ 4514】[Sdoi2016]数字配对 费用流
利用spfa流的性质,我直接拆两半,正解分奇偶(妙),而且判断是否整除且质数我用的是暴力根号,整洁判断质数个数差一(其他非spfa流怎么做?) #include <cstdio> #inc ...
- 4514: [Sdoi2016]数字配对 费用流
链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4514 思路 EK直接贪心做 <0的时候加上剩余返回 二分图a->b的时候 把b- ...
- BZOJ4514[Sdoi2016]数字配对——最大费用最大流
题目描述 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对,并获得 ci ...
- 【BZOJ4514】【SDOI2016】数字配对 [费用流]
数字配对 Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 有 n 种数字,第 i 种数字是 ...
- bzoj4514: [Sdoi2016]数字配对(费用流)
传送门 ps:费用流增广的时候费用和流量打反了……调了一个多小时 每个数只能参与一次配对,那么这就是一个匹配嘛 我们先把每个数分解质因数,记质因子总个数为$cnt_i$,那如果$a_i/a_j$是质数 ...
- [bzoj4514]数字配对[费用流]
今年SDOI的题,看到他们在做,看到过了一百多个人,然后就被虐惨啦... 果然考试的时候还是打不了高端算法,调了...几天 默默地yy了一个费用流构图: 源连所有点,配对的点连啊,所有点连汇... 后 ...
随机推荐
- URL编码表%20Base64编码表%20HTTP消息含义
URL编码表 backspace 8% A 41% a 61% § %A7 Õ %D5 tab 9% B 42% b 62% « %AB Ö %D6 linefeed %0A C 43% c ...
- JAVA Day3
分支与循环 char sex = in.next().charAt(0); java中 ...
- Dialog+NumberPicker
package com.gtercn.myapplication; import android.app.Activity; import android.content.DialogInterf ...
- struts2总结一:MVC设计模式
设计模式 一.什么是编程里面的设计模式? 1.设计模式是一套被反复使用,多数人知晓的,代码设计经验的总结. 2.模式必须是典型问题(不是个别问题)的解决方案. 二.设计模式的作用 1.解决一类问题的成 ...
- 如何清除swap里的文件
vi打开一个文件的时候突然断网,再次连接上去vi打开的时候提示在swap里面已经存在一个.要删除这个文件怎么办呢? 如下: 关了swapoff -a后 再ls -al查看 把文件所在目录里*.swp结 ...
- OpenCV 第二课 认识图像的存储结构
OpenCV 第二课 认识图像的存储结构 Mat Mat 类包含两部分,矩阵头和矩阵体.矩阵头包含矩阵的大小,存储方式和矩阵体存储空间的指针.因此,Mat中矩阵头的大小是固定的,矩阵体大小是不定的. ...
- BZOJ4426 : [Nwerc2015]Better Productivity最大生产率
如果一个区间包含另一个区间,那么这两个区间是否在一起的生产率是一样的. 将所有这种包含了其他区间的区间放入数组$b$,其余的放入数组$c$,有多个相同的时候则从$b$移一个到$c$. 那么$c$里所有 ...
- 网易大手笔领投美国VR触觉公司AxonVR
12月8日消息,美国西雅图VR触觉公司AxonVR今日宣布完成了580万美元的种子轮融资,由中国网易和Dawn Patrol Ventures领投.此次融资完成后AxonVR的总融资额将攀升至700万 ...
- Codeforces Round #250 (Div. 2) A. The Child and Homework
注意题目长度不能考虑前缀,而且如果即存在一个选项的长度的两倍小于其他所有选项的长度,也存在一个选项的长度大于其他选项长度的两倍,则答案不是一个好的选择,只能选择C. #include <iost ...
- 旋转轮子 UIActivityIndicatorView
旋转轮子 *activityView = [[UIActivityIndicatorView alloc ]initWithActivityIndicatorStyle:UIActivityIndic ...