4514

思路:

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

  解法有两种:

    解法1:

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

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

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

    解法2:

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

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

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

来,上代码:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8. #define ll long long
  9. #define INF 0x7ffffffffff
  10.  
  11. ll n,prime[],num_prime=,ai[],bi[],ci[];
  12. ll s,t,head[],E[],V[],W[],F[];
  13. ll cnt=,pre[],que[],dis[];
  14.  
  15. bool if_prime[],d1iv[],if_[];
  16.  
  17. inline void in(ll &now)
  18. {
  19. ll if_z=;now=;
  20. char Cget=getchar();
  21. while(Cget>''||Cget<'')
  22. {
  23. if(Cget=='-') if_z=-;
  24. Cget=getchar();
  25. }
  26. while(Cget>=''&&Cget<='')
  27. {
  28. now=now*+Cget-'';
  29. Cget=getchar();
  30. }
  31. now*=if_z;
  32. }
  33.  
  34. void euler(ll limit)
  35. {
  36. for(ll i=;i<=limit;i++)
  37. {
  38. if(!if_prime[i]) prime[++num_prime]=i;
  39. for(ll j=;prime[j]*i<=limit&&j<=num_prime;j++)
  40. {
  41. if_prime[i*prime[j]]=true;
  42. if(i%prime[j]==) break;
  43. }
  44. }
  45. }
  46.  
  47. inline bool cut(ll op)
  48. {
  49. ll res=,now=;
  50. while(op!=&&now<)
  51. {
  52. now++;
  53. while(!(op%prime[now])) op/=prime[now],res++;
  54. }
  55. return res&;
  56. }
  57.  
  58. inline void edge_add(ll u,ll v,ll w,ll f)
  59. {
  60. E[++cnt]=head[u],head[u]=cnt,W[cnt]=w,F[cnt]=f,V[cnt]=v;
  61. E[++cnt]=head[v],head[v]=cnt,W[cnt]=-w,F[cnt]=,V[cnt]=u;
  62. }
  63.  
  64. inline bool spfa()
  65. {
  66. for(ll i=s;i<=t;i++) dis[i]=-INF,if_[i]=false,pre[i]=-;
  67. ll h=,tail=;que[]=s,if_[s]=true,dis[s]=;
  68. while(h<tail)
  69. {
  70. ll now=que[h++];if_[now]=false;
  71. for(ll i=head[now];i;i=E[i])
  72. {
  73. if(F[i]>&&dis[V[i]]<dis[now]+W[i])
  74. {
  75. pre[V[i]]=i;
  76. dis[V[i]]=dis[now]+W[i];
  77. if(!if_[V[i]])
  78. {
  79. if_[V[i]]=true;
  80. que[tail++]=V[i];
  81. }
  82. }
  83. }
  84. }
  85. return dis[t]!=-INF;
  86. }
  87.  
  88. int main()
  89. {
  90. in(n);euler(),t=n+;
  91. for(ll i=;i<=n;i++) in(ai[i]);
  92. for(ll i=;i<=n;i++) in(bi[i]);
  93. for(ll i=;i<=n;i++) in(ci[i]);
  94. for(ll i=;i<=n;i++)
  95. {
  96. if(cut(ai[i]))
  97. {
  98. d1iv[i]=true;
  99. edge_add(i,t,,bi[i]);
  100. }
  101. else edge_add(s,i,,bi[i]);
  102. }
  103. for(ll i=;i<=n;i++)
  104. {
  105. if(!d1iv[i])
  106. {
  107. for(ll j=;j<=n;j++)
  108. {
  109. if(d1iv[j])
  110. {
  111. ll a=max(ai[i],ai[j]),b=min(ai[i],ai[j]);
  112. if(a==b||a%b) continue;
  113. if(!if_prime[a/b]) edge_add(i,j,ci[i]*ci[j],INF);
  114. }
  115. }
  116. }
  117. }
  118. ll ans=,cii=;
  119. while(spfa())
  120. {
  121. ll now=t,pos=INF;
  122. while(pre[now]!=-)
  123. {
  124. pos=min(pos,F[pre[now]]);
  125. now=V[pre[now]^];
  126. }
  127. now=t;
  128. while(pre[now]!=-)
  129. {
  130. F[pre[now]]-=pos;
  131. F[pre[now]^]+=pos;
  132. now=V[pre[now]^];
  133. }
  134. if(cii+dis[t]*pos<)
  135. {
  136. ans+=cii/(-dis[t]);
  137. break;
  138. }
  139. ans+=pos,cii+=dis[t]*pos;
  140. }
  141. cout<<ans;
  142. return ;
  143. }
  1. #include <cmath>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <iostream>
  5. #include <algorithm>
  6.  
  7. using namespace std;
  8.  
  9. #define maxn 205
  10. #define maxm 1000005
  11. #define ll long long
  12. #define INF 0x7ffffffffff
  13.  
  14. ll que[maxm],E[maxm],V[maxm],F[maxm],W[maxm],cnt=,bi[maxn];
  15. ll n,head[maxn<<],s,t,dis[maxn<<],pre[maxn<<],ai[maxn],ci[maxn];
  16.  
  17. bool if_[maxn<<];
  18.  
  19. inline void in(ll &now)
  20. {
  21. ll if_z=;now=;
  22. char Cget=getchar();
  23. while(Cget>''||Cget<'')
  24. {
  25. if(Cget=='-') if_z=-;
  26. Cget=getchar();
  27. }
  28. while(Cget>=''&&Cget<='')
  29. {
  30. now=now*+Cget-'';
  31. Cget=getchar();
  32. }
  33. now*=if_z;
  34. }
  35.  
  36. inline void edge_add(ll u,ll v,ll w,ll f)
  37. {
  38. E[++cnt]=head[u],V[cnt]=v,W[cnt]=w,F[cnt]=f,head[u]=cnt;
  39. E[++cnt]=head[v],V[cnt]=u,W[cnt]=-w,F[cnt]=,head[v]=cnt;
  40. }
  41.  
  42. inline bool judge(ll op)
  43. {
  44. ll lit=sqrt(op);
  45. for(ll i=;i<=lit;i++) if(!(op%i)) return false;
  46. return true;
  47. }
  48.  
  49. inline bool spfa()
  50. {
  51. for(ll i=s;i<=t;i++) dis[i]=-INF,pre[i]=-,if_[i]=false;
  52. ll h=,tail=;dis[s]=,que[]=s,if_[s]=true;
  53. while(h<tail)
  54. {
  55. ll now=que[h++];if_[now]=false;
  56. for(ll i=head[now];i;i=E[i])
  57. {
  58. if(F[i]>&&dis[V[i]]<dis[now]+W[i])
  59. {
  60. pre[V[i]]=i,dis[V[i]]=dis[now]+W[i];
  61. if(!if_[V[i]]) if_[V[i]]=true,que[tail++]=V[i];
  62. }
  63. }
  64. }
  65. return dis[t]!=-INF;
  66. }
  67.  
  68. int main()
  69. {
  70. freopen("menci_pair.in","r",stdin);
  71. freopen("menci_pair.out","w",stdout);
  72. in(n),t=n<<|;
  73. for(ll i=;i<=n;i++) in(ai[i]);
  74. for(ll i=;i<=n;i++)
  75. {
  76. in(bi[i]);
  77. edge_add(s,i,,bi[i]);
  78. edge_add(i+n,t,,bi[i]);
  79. }
  80. for(ll i=;i<=n;i++) in(ci[i]);
  81. for(ll i=;i<=n;i++)
  82. {
  83. for(ll j=;j<=n;j++)
  84. {
  85. if(ai[i]<=ai[j]||ai[i]%ai[j]) continue;
  86. if(judge(ai[i]/ai[j]))
  87. {
  88. edge_add(i,j+n,ci[i]*ci[j],INF);
  89. edge_add(j,i+n,ci[i]*ci[j],INF);
  90. }
  91. }
  92. }
  93. ll ans=,cii=;
  94. while(spfa())
  95. {
  96. ll now=t,pos=INF;
  97. while(pre[now]!=-)
  98. {
  99. pos=min(pos,F[pre[now]]);
  100. now=V[pre[now]^];
  101. }
  102. now=t;
  103. while(pre[now]!=-)
  104. {
  105. F[pre[now]]-=pos;
  106. F[pre[now]^]+=pos;
  107. now=V[pre[now]^];
  108. }
  109. if(cii+dis[t]*pos<)
  110. {
  111. ans+=cii/abs(dis[t]);
  112. break;
  113. }
  114. ans+=pos,cii+=dis[t]*pos;
  115. }
  116. cout<<ans/;
  117. return ;
  118. }

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. [Hdu3652]B-number(数位DP)

    Description 题目大意:求小于n是13的倍数且含有'13'的数的个数. (1 <= n <= 1000000000) Solution 数位DP,题目需要包含13,且被13整除, ...

  2. Patrick and Shopping

    Patrick and Shopping 今天 Patrick 等待着他的朋友 Spongebob 来他家玩.为了迎接 Spongebob,Patrick 需要去他家附近的两家商店  买一些吃的.他家 ...

  3. git上传自己的代码

    感谢这个哥们的博客,不过里面有些错误. http://www.cnblogs.com/ruofengzhishang/p/3842587.html 下面是我自己的实践成功的: 这篇文章写得是windo ...

  4. loj2292 「THUSC 2016」成绩单

    ref 我是傻逼,我啥也不会,这是我抄的. #include <iostream> #include <cstring> #include <cstdio> usi ...

  5. plsql编程

    ORACLE PL/SQL编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设计语言,该 ...

  6. 在windows64位上安装Python3.0

    1.下载安装包 下载地址:https://www.python.org/downloads/ 如果要下载帮助文件:Download Windows help file 如果要下载基于网页的安装程序: ...

  7. Halcon18 Linux 下载

    Halcon18 Linux下载地址:http://www.211xun.com/download_page_14.html HALCON 18 是一套机器视觉图像处理库,由一千多个算子以及底层的数据 ...

  8. C#中静态变量和 静态方法的作用

    1.静态变量 在C#程序中,没有全局变量的概念,这意味着所有的成员变量只有该类的实例才能操作这些数据,这起到了“信息隐藏”的作用.但有些时候,这样做却不是个明智的选择. 假设我们要定义一个图书类,要求 ...

  9. HDU 4178 模拟

    Roll-call in Woop Woop High Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

  10. VS 2013插件

    http://www.spersky.com/post/vsPlugins.html http://vswebessentials.com/download http://developer.51ct ...