[bzoj4514]数字配对[费用流]
今年SDOI的题,看到他们在做,看到过了一百多个人,然后就被虐惨啦。。。
果然考试的时候还是打不了高端算法,调了。。。几天
默默地yy了一个费用流构图:
源连所有点,配对的点连啊,所有点连汇。。。
后来罗爷爷提醒我这样子会wa,因为你无法保证所有点都没有超过B[I]次,too naive
正解是还要考虑到奇数/偶数个质数的数字,把它们变成可二分图,看出这个性质就OK了。。。
至于要保证费用下界的问题,这个。。我也不知道为什么我原来的方法不行
后来照着标程改的,加了一行memset就过了,一脸懵逼
又贡献了一道orzliyicheng没过的题,yeah~O(∩_∩)O
#include<cstdio>
#include<algorithm>
#include<cstring>
#define mo 200000
#define value pri
#define N 200000
#define vis flag
#define ll long long
#define inf 10000000000000LL
using namespace std;
ll maxn=,S,T,num,n,edgenum;
ll ans,tmp;
ll next[N],head[N],up[N],flag[N],vet[N],pri[N],from[N],cost[N],q[N],dis[N],a[N],b[N],c[N],f[N];
void add(int u,int v,ll w,ll c)
{
//printf("%d %d %lld %lld\n",u,v,w,c);
edgenum++;vet[edgenum]=v;next[edgenum]=head[u];head[u]=edgenum;
pri[edgenum]=w;cost[edgenum]=c;from[edgenum]=u;
}
ll min(ll a,ll b)
{
if(a<b)return a;else return b;
}
bool spfa()
{
memset(dis,,sizeof(dis));
memset(up,,sizeof(up));
dis[S]=;
vis[S]=;
q[]=S;
;,tail=;
while (tou<=tail)
{
;//printf("query=%d\n",x);
for (int i=head[x];i;i=next[i])
if (pri[i]&&dis[vet[i]]>dis[x]+cost[i])
{
//printf("vet=%d\n",vet[i]);
dis[vet[i]]=dis[x]+cost[i];
up[vet[i]]=i;
,tail++,q[tail%mo]=vet[i];//printf("tail=%d\n",tail);
;
}
tou++;
}
//for(int i=0;i<=T;i++)printf("%lld ",dis[i]);printf("\n");
;
;
}
bool flow()
{
int minn=inf;
for (int i=up[T];i;i=up[from[i]])
minn=min(minn,pri[i]);
//printf("min==%lld %lld\n",dis[T],minn);
)
{
for (int i=up[T];i;i=up[from[i]])
{
;==)ee=i-;
pri[i]-=minn;
pri[ee]+=minn;
}
ans+=minn;
tmp+=dis[T]*minn;
;
}
;}
}
void dinic()
{
ans=;tmp=;
;i<=T;i++)flag[i]=;
while (spfa()&&flow());
printf("%lld",ans);
}
ll calc(ll x)
{
ll ans=;
;i<=num;i++)
)
{
x/=pri[i];ans++;
}
)ans++;return ans;
}
int main()
{
freopen("4514.in","r",stdin);
freopen("4514.out","w",stdout);
scanf("%lld",&n);
;i<=n;i++)scanf("%lld",&a[i]);
;i<=n;i++)scanf("%lld",&b[i]);
;i<=n;i++)scanf("%lld",&c[i]);
;i<=maxn;i++)
{
)num++,pri[num]=i;
;j<=num;j++)
{
if(pri[j]*i>maxn)break;
flag[pri[j]*i]=;
)break;
}
}
;i<=n;i++)f[i]=calc(a[i]);
S=n+,T=n+;
;i<=n;i++)
==)add(S,i,b[i],),add(i,S,,);),add(T,i,,);
;i<=n;i++)
;j<=n;j++)
))
{
int u,v;
==)u=i;==)v=i;else v=j;
add(u,v,inf,-c[i]*c[j]);//printf("%d %d\n",c[i],c[j]);
add(v,u,,c[i]*c[j]);
}
dinic();
}
[bzoj4514]数字配对[费用流]的更多相关文章
- [SDOI2016][bzoj4514] 数字配对 [费用流]
题面 传送门 思路 一个数字能且只能匹配一次 这引导我们思考:一次代表什么?代表用到一定上限(b数组)就不能再用,同时每用一次会产生价值(c数组) 上限?价值?网络流! 把一次匹配设为一点流量,那产生 ...
- 【BZOJ4514】[Sdoi2016]数字配对 费用流
[BZOJ4514][Sdoi2016]数字配对 Description 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ...
- 【BZOJ4514】【SDOI2016】数字配对 [费用流]
数字配对 Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 有 n 种数字,第 i 种数字是 ...
- bzoj4514: [Sdoi2016]数字配对--费用流
看了一眼题目&数据范围,觉得应该是带下界的费用流 原来想拆点变成二分图,能配对的连边,跑二分图,可行性未知 后来看到另外一种解法.. 符合匹配要求的数要满足:质因子的个数相差为1,且两者可整除 ...
- 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 数字配对
思路 首先想到费用流. 对于每个点拆点.然后考虑我们怎样才能保证每个点只被用一次. 如果\(i\)与\(j\)满足条件.那么就从\(i\)向\(j\)连一条边并且从\(j\)向\(i\)连一条边.这样 ...
随机推荐
- HDU 5831 Rikka with Parenthesis II (贪心) -2016杭电多校联合第8场
题目:传送门. 题意:T组数据,每组给定一个长度n,随后给定一个长度为n的字符串,字符串只包含'('或')',随后交换其中两个位置,必须交换一次也只能交换一次,问能否构成一个合法的括号匹配,就是()( ...
- 如何获得images.xcassets 中图片的路径?
UIImage加载图片的方式以及Images.xcassets对于加载方法的影响 重点: Images.xcassets中的图片资源只能通过imageNamed:方法加载,通过NSBundle的pat ...
- 解决Windows10下80端口被PID为4的System占用的问题
一.背景 最近由于好奇心,更新了windows10系统,感觉上手还蛮快,而且体验还不错,但是在IDEA中做开发时,使用80端口进行启动项目的时候发现端口被占用了,于是尝试解决这个问题.具体步骤如下,分 ...
- python基础——filter函数
python基础——filter函数 Python内建的filter()函数用于过滤序列. 和map()类似,filter()也接收一个函数和一个序列.和map()不同的是,filter()把传入的函 ...
- 一个简单的jsp+servlet实例,实现简单的登录
开发环境myeclipse+tomcat6 1.先创建web project,项目名为RegisterSystem, 2.在WebRoot 目录下创建login.jsp文件,只需修改body中的内容, ...
- Linux系统启动过程分析
[原创]Linux系统启动过程分析-wjlkoorey258-ChinaUnix博客http://blog.chinaunix.net/uid-23069658-id-3142047.html 经过对 ...
- 【JAVA IO流之字符流】
一.概述. java对数据的操作是通过流的方式.java用于操作流的对象都在IO包中.流按照操作数据不同分为两种,字节流和字符流.流按照流向分为输入流,输出流. 输入输出的“入”和“出”是相当于内存来 ...
- python检测文件的MD5值
python检测文件的MD5值MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2.MD3和MD4发展而来.MD5算法的使用不需要支付任何版权 ...
- Sencha Architect 安装与使用
http://www.sencha.com/products/touch/ Sencha SDK Tools Advanced JavaScript and CSS Project Build Too ...
- css3 妙味
css3 属性 <!DOCTYPE html> <html> <head lang="en"> <meta charset="U ...