4514

思路:

  很受伤现在,,测了那么多次不过的原因就是因为INF不够大;

  解法有两种:

    解法1:

      把n个点按照质因数个数为奇或偶分为两个点集(很容易就可以想到);

      然后,按照题目连边跑最大费用流;

      当累计的能量马上就要小于0时,退出循环,输出答案;

    解法2:

      把n个点拆成2*n个点,也是两个集合;

      如果ai[i]到ai[j]可以连边,则i连j+n,同时j连i+n;

      当累计的能量马上就要小于0时,退出循环,输出答案/2;

来,上代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; #define ll long long
#define INF 0x7ffffffffff ll n,prime[],num_prime=,ai[],bi[],ci[];
ll s,t,head[],E[],V[],W[],F[];
ll cnt=,pre[],que[],dis[]; bool if_prime[],d1iv[],if_[]; inline void in(ll &now)
{
ll if_z=;now=;
char Cget=getchar();
while(Cget>''||Cget<'')
{
if(Cget=='-') if_z=-;
Cget=getchar();
}
while(Cget>=''&&Cget<='')
{
now=now*+Cget-'';
Cget=getchar();
}
now*=if_z;
} void euler(ll limit)
{
for(ll i=;i<=limit;i++)
{
if(!if_prime[i]) prime[++num_prime]=i;
for(ll j=;prime[j]*i<=limit&&j<=num_prime;j++)
{
if_prime[i*prime[j]]=true;
if(i%prime[j]==) break;
}
}
} inline bool cut(ll op)
{
ll res=,now=;
while(op!=&&now<)
{
now++;
while(!(op%prime[now])) op/=prime[now],res++;
}
return res&;
} inline void edge_add(ll u,ll v,ll w,ll f)
{
E[++cnt]=head[u],head[u]=cnt,W[cnt]=w,F[cnt]=f,V[cnt]=v;
E[++cnt]=head[v],head[v]=cnt,W[cnt]=-w,F[cnt]=,V[cnt]=u;
} inline bool spfa()
{
for(ll i=s;i<=t;i++) dis[i]=-INF,if_[i]=false,pre[i]=-;
ll h=,tail=;que[]=s,if_[s]=true,dis[s]=;
while(h<tail)
{
ll now=que[h++];if_[now]=false;
for(ll i=head[now];i;i=E[i])
{
if(F[i]>&&dis[V[i]]<dis[now]+W[i])
{
pre[V[i]]=i;
dis[V[i]]=dis[now]+W[i];
if(!if_[V[i]])
{
if_[V[i]]=true;
que[tail++]=V[i];
}
}
}
}
return dis[t]!=-INF;
} int main()
{
in(n);euler(),t=n+;
for(ll i=;i<=n;i++) in(ai[i]);
for(ll i=;i<=n;i++) in(bi[i]);
for(ll i=;i<=n;i++) in(ci[i]);
for(ll i=;i<=n;i++)
{
if(cut(ai[i]))
{
d1iv[i]=true;
edge_add(i,t,,bi[i]);
}
else edge_add(s,i,,bi[i]);
}
for(ll i=;i<=n;i++)
{
if(!d1iv[i])
{
for(ll j=;j<=n;j++)
{
if(d1iv[j])
{
ll a=max(ai[i],ai[j]),b=min(ai[i],ai[j]);
if(a==b||a%b) continue;
if(!if_prime[a/b]) edge_add(i,j,ci[i]*ci[j],INF);
}
}
}
}
ll ans=,cii=;
while(spfa())
{
ll now=t,pos=INF;
while(pre[now]!=-)
{
pos=min(pos,F[pre[now]]);
now=V[pre[now]^];
}
now=t;
while(pre[now]!=-)
{
F[pre[now]]-=pos;
F[pre[now]^]+=pos;
now=V[pre[now]^];
}
if(cii+dis[t]*pos<)
{
ans+=cii/(-dis[t]);
break;
}
ans+=pos,cii+=dis[t]*pos;
}
cout<<ans;
return ;
}
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; #define maxn 205
#define maxm 1000005
#define ll long long
#define INF 0x7ffffffffff ll que[maxm],E[maxm],V[maxm],F[maxm],W[maxm],cnt=,bi[maxn];
ll n,head[maxn<<],s,t,dis[maxn<<],pre[maxn<<],ai[maxn],ci[maxn]; bool if_[maxn<<]; inline void in(ll &now)
{
ll if_z=;now=;
char Cget=getchar();
while(Cget>''||Cget<'')
{
if(Cget=='-') if_z=-;
Cget=getchar();
}
while(Cget>=''&&Cget<='')
{
now=now*+Cget-'';
Cget=getchar();
}
now*=if_z;
} inline void edge_add(ll u,ll v,ll w,ll f)
{
E[++cnt]=head[u],V[cnt]=v,W[cnt]=w,F[cnt]=f,head[u]=cnt;
E[++cnt]=head[v],V[cnt]=u,W[cnt]=-w,F[cnt]=,head[v]=cnt;
} inline bool judge(ll op)
{
ll lit=sqrt(op);
for(ll i=;i<=lit;i++) if(!(op%i)) return false;
return true;
} inline bool spfa()
{
for(ll i=s;i<=t;i++) dis[i]=-INF,pre[i]=-,if_[i]=false;
ll h=,tail=;dis[s]=,que[]=s,if_[s]=true;
while(h<tail)
{
ll now=que[h++];if_[now]=false;
for(ll i=head[now];i;i=E[i])
{
if(F[i]>&&dis[V[i]]<dis[now]+W[i])
{
pre[V[i]]=i,dis[V[i]]=dis[now]+W[i];
if(!if_[V[i]]) if_[V[i]]=true,que[tail++]=V[i];
}
}
}
return dis[t]!=-INF;
} int main()
{
freopen("menci_pair.in","r",stdin);
freopen("menci_pair.out","w",stdout);
in(n),t=n<<|;
for(ll i=;i<=n;i++) in(ai[i]);
for(ll i=;i<=n;i++)
{
in(bi[i]);
edge_add(s,i,,bi[i]);
edge_add(i+n,t,,bi[i]);
}
for(ll i=;i<=n;i++) in(ci[i]);
for(ll i=;i<=n;i++)
{
for(ll j=;j<=n;j++)
{
if(ai[i]<=ai[j]||ai[i]%ai[j]) continue;
if(judge(ai[i]/ai[j]))
{
edge_add(i,j+n,ci[i]*ci[j],INF);
edge_add(j,i+n,ci[i]*ci[j],INF);
}
}
}
ll ans=,cii=;
while(spfa())
{
ll now=t,pos=INF;
while(pre[now]!=-)
{
pos=min(pos,F[pre[now]]);
now=V[pre[now]^];
}
now=t;
while(pre[now]!=-)
{
F[pre[now]]-=pos;
F[pre[now]^]+=pos;
now=V[pre[now]^];
}
if(cii+dis[t]*pos<)
{
ans+=cii/abs(dis[t]);
break;
}
ans+=pos,cii+=dis[t]*pos;
}
cout<<ans/;
return ;
}

AC日记——[Sdoi2016]数字配对 bzoj 4514的更多相关文章

  1. 图论(费用流):BZOJ 4514 [Sdoi2016]数字配对

    4514: [Sdoi2016]数字配对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 820  Solved: 345[Submit][Status ...

  2. BZOJ 4514: [Sdoi2016]数字配对 [费用流 数论]

    4514: [Sdoi2016]数字配对 题意: 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数 ...

  3. BZOJ 4514: [Sdoi2016]数字配对

    4514: [Sdoi2016]数字配对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1606  Solved: 608[Submit][Statu ...

  4. 【bzoj4514】: [Sdoi2016]数字配对 图论-费用流

    [bzoj4514]: [Sdoi2016]数字配对 好像正常的做法是建二分图? 我的是拆点然后 S->i cap=b[i] cost=0 i'->T cap=b[i] cost=0 然后 ...

  5. 【BZOJ4514】[Sdoi2016]数字配对 费用流

    [BZOJ4514][Sdoi2016]数字配对 Description 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ...

  6. BZOJ.4514.[SDOI2016]数字配对(费用流SPFA 二分图)

    BZOJ 洛谷 \(Solution\) 很显然的建二分图后跑最大费用流,但有个问题是一个数是只能用一次的,这样二分图两部分都有这个数. 那么就用两倍的.如果\(i\)可以向\(j'\)连边,\(j\ ...

  7. 【BZOJ 4514】[Sdoi2016]数字配对 费用流

    利用spfa流的性质,我直接拆两半,正解分奇偶(妙),而且判断是否整除且质数我用的是暴力根号,整洁判断质数个数差一(其他非spfa流怎么做?) #include <cstdio> #inc ...

  8. 4514: [Sdoi2016]数字配对

    Description 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对 ...

  9. 4514: [Sdoi2016]数字配对 费用流

    链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4514 思路 EK直接贪心做 <0的时候加上剩余返回 二分图a->b的时候 把b- ...

随机推荐

  1. Linux命令之----tree

    命令简介 tree命令的中文意思为“树”,功能是以树形结构列出指定目录下的所有内容,包括所有文件.子目录及子目录里的目录和文件. 命令格式 tree [option] [directory]tree ...

  2. volatile、synchronized、lock有什么区别,以及在哪些场景下使用哪种方式?

    [转]JVM锁机制volatile/synchronized/lock 1.volatile实现原理 (1)聊聊并发(一)——深入分析Volatile的实现原理 --硬件级别锁实现,Lock前缀指令会 ...

  3. HDU 1847 Good Luck in CET-4 Everybody!(SG函数)

    Good Luck in CET-4 Everybody! Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  4. 03012_会话技术Cookie&Session

    1.会话技术简介 (1)存储客户端的技术 网站的购物系统,用户将购买的商品信息存储到哪里?因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术识 ...

  5. 【精彩回顾】第二届微医前端技术沙龙(附PPT下载)

    5 月 25 日,以「无界」为主题的第二届微医前端技术沙龙成功举办.本届沙龙的演讲题目涵盖了前端技术几个主要的应用场景,包括服务端.桌面端以及跨平台的开发.最近几年前端技术发展非常快,各种可以提高开发 ...

  6. IOS开发学习笔记027-UITableView 使用模型对象

    1.模型对象 2.单组数据的显示 1.模型对象 继续优化上一个程序 上一次用到字典,但是坏处多多.这里将这些数据封装到类中. 这就是MVC中得模型,模型就是数据的显示结构 新建一个类,添加几个属性和一 ...

  7. IOS开发学习笔记007-数据结构

    目录: 1.全局变量和局部变量 2.结构体 3.结构体数组 4.结构体做函数参数 5.结构体指针 6.枚举 7.总结 一.全局变量和局部变量 全局变量和局部变量的区别 1. 全局变量,再函数外定义的变 ...

  8. python 学习分享-函数篇2

    递归 自己玩自己的函数: 1. 必须有一个明确的结束条件 2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少 3. 递归效率不高,递归层次过多会导致栈溢出 递归例子和二分查找都放在里面了 ...

  9. php 判断一个点是否在一个多边形区域内

    <?php class pointMap{ private static $coordArray; private static $vertx = []; private static $ver ...

  10. [错误解决]paramiko.ssh_exception.SSHException: Error reading SSH protocol banner 设置

    报错信息 上午的时候数据组的同事跟我说有几个程序报错,经过查看log发现找到报错信息: paramiko.ssh_exception.SSHException: Error reading SSH p ...