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了一个费用流构图: 源连所有点,配对的点连啊,所有点连汇... 后 ...
随机推荐
- Fragment详解之三——管理Fragment(1)
相关文章: 1.<Fragment详解之一--概述>2.<Fragment详解之二--基本使用方法>3.<Fragment详解之三--管理Fragment(1)>4 ...
- hdu3496 二维01背包
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3496 //刚看题目以为是简单的二维01背包,but,,有WA点.. 思路:题中说,只能买M ...
- 【hdu3948-不同回文串的个数】后缀数组
题意:求不同回文串的个数 n<=10^5 题解: 先按照manacher的构造方法改造一遍串,然后跑一遍manacher. 如ababa--> $#a#b#a#b#a#@ 然后跑一遍后缀数 ...
- js小例子(标签页)
运用js写的一个小例子,实现点击不同的标签出现不同的内容: <!DOCTYPE html> <html> <head> <meta chaset=" ...
- unity 播放音乐
创建一个AudioSource组件,拖一个mp3组件到这个组建上 新建一个脚本,拖audiosource到audiosource的声明上 using UnityEngine; using System ...
- HDU 3333 & 主席树
题意: balabala SOL: 这题用主席树怎么做呢...貌似一模一样...一个一个建n棵的线段树.先把上一棵树复制下来,当a[i]出现过,就把这棵树里的那个位置去掉------一模一样的思维.. ...
- ACM A problem is easy
A problem is easy 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 When Teddy was a child , he was always th ...
- ACM 分数加减法
分数加减法 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 编写一个C程序,实现两个分数的加减法 输入 输入包含多行数据 每行数据是一个字符串,格式是" ...
- ACM: Find MaxXorSum 解题报告-字典树
Find MaxXorSum Time Limit:2000MS Memory Limit:65535KB 64bit IO Format: Description Given n non-negat ...
- 这次,雅虎真的撤销QA团队了
在一个软件开发过程中取消了质量保证团队会发生什么?更少,而不是更多的错误,以及一个大大加快的开发周期. 至少,根据雅虎的经验,确实如此.该公司的首席设计师Amotz Maimon,以及科学与技术高级副 ...