今年SDOI的题,看到他们在做,看到过了一百多个人,然后就被虐惨啦。。。

果然考试的时候还是打不了高端算法,调了。。。几天

默默地yy了一个费用流构图:

源连所有点,配对的点连啊,所有点连汇。。。

后来罗爷爷提醒我这样子会wa,因为你无法保证所有点都没有超过B[I]次,too naive

正解是还要考虑到奇数/偶数个质数的数字,把它们变成可二分图,看出这个性质就OK了。。。

至于要保证费用下界的问题,这个。。我也不知道为什么我原来的方法不行

后来照着标程改的,加了一行memset就过了,一脸懵逼

又贡献了一道orzliyicheng没过的题,yeah~O(∩_∩)O

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. #define mo 200000
  5. #define value pri
  6. #define N 200000
  7. #define vis flag
  8. #define ll long long
  9. #define inf 10000000000000LL
  10. using namespace std;
  11. ll maxn=,S,T,num,n,edgenum;
  12. ll ans,tmp;
  13. 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];
  14. void add(int u,int v,ll w,ll c)
  15. {
  16. //printf("%d %d %lld %lld\n",u,v,w,c);
  17. edgenum++;vet[edgenum]=v;next[edgenum]=head[u];head[u]=edgenum;
  18. pri[edgenum]=w;cost[edgenum]=c;from[edgenum]=u;
  19. }
  20. ll min(ll a,ll b)
  21. {
  22. if(a<b)return a;else return b;
  23. }
  24. bool spfa()
  25. {
  26. memset(dis,,sizeof(dis));
  27. memset(up,,sizeof(up));
  28. dis[S]=;
  29. vis[S]=;
  30. q[]=S;
  31. ;,tail=;
  32. while (tou<=tail)
  33. {
  34. ;//printf("query=%d\n",x);
  35. for (int i=head[x];i;i=next[i])
  36. if (pri[i]&&dis[vet[i]]>dis[x]+cost[i])
  37. {
  38. //printf("vet=%d\n",vet[i]);
  39. dis[vet[i]]=dis[x]+cost[i];
  40. up[vet[i]]=i;
  41. ,tail++,q[tail%mo]=vet[i];//printf("tail=%d\n",tail);
  42. ;
  43. }
  44. tou++;
  45. }
  46. //for(int i=0;i<=T;i++)printf("%lld ",dis[i]);printf("\n");
  47. ;
  48. ;
  49. }
  50. bool flow()
  51. {
  52. int minn=inf;
  53. for (int i=up[T];i;i=up[from[i]])
  54. minn=min(minn,pri[i]);
  55. //printf("min==%lld %lld\n",dis[T],minn);
  56. )
  57. {
  58. for (int i=up[T];i;i=up[from[i]])
  59. {
  60. ;==)ee=i-;
  61. pri[i]-=minn;
  62. pri[ee]+=minn;
  63. }
  64. ans+=minn;
  65. tmp+=dis[T]*minn;
  66. ;
  67. }
  68. ;}
  69. }
  70. void dinic()
  71. {
  72. ans=;tmp=;
  73. ;i<=T;i++)flag[i]=;
  74. while (spfa()&&flow());
  75. printf("%lld",ans);
  76. }
  77. ll calc(ll x)
  78. {
  79. ll ans=;
  80. ;i<=num;i++)
  81. )
  82. {
  83. x/=pri[i];ans++;
  84. }
  85. )ans++;return ans;
  86. }
  87. int main()
  88. {
  89. freopen("4514.in","r",stdin);
  90. freopen("4514.out","w",stdout);
  91. scanf("%lld",&n);
  92. ;i<=n;i++)scanf("%lld",&a[i]);
  93. ;i<=n;i++)scanf("%lld",&b[i]);
  94. ;i<=n;i++)scanf("%lld",&c[i]);
  95. ;i<=maxn;i++)
  96. {
  97. )num++,pri[num]=i;
  98. ;j<=num;j++)
  99. {
  100. if(pri[j]*i>maxn)break;
  101. flag[pri[j]*i]=;
  102. )break;
  103. }
  104. }
  105. ;i<=n;i++)f[i]=calc(a[i]);
  106. S=n+,T=n+;
  107. ;i<=n;i++)
  108. ==)add(S,i,b[i],),add(i,S,,);),add(T,i,,);
  109. ;i<=n;i++)
  110. ;j<=n;j++)
  111. ))
  112. {
  113. int u,v;
  114. ==)u=i;==)v=i;else v=j;
  115. add(u,v,inf,-c[i]*c[j]);//printf("%d %d\n",c[i],c[j]);
  116. add(v,u,,c[i]*c[j]);
  117. }
  118. dinic();
  119. }

[bzoj4514]数字配对[费用流]的更多相关文章

  1. [SDOI2016][bzoj4514] 数字配对 [费用流]

    题面 传送门 思路 一个数字能且只能匹配一次 这引导我们思考:一次代表什么?代表用到一定上限(b数组)就不能再用,同时每用一次会产生价值(c数组) 上限?价值?网络流! 把一次匹配设为一点流量,那产生 ...

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

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

  3. 【BZOJ4514】【SDOI2016】数字配对 [费用流]

    数字配对 Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 有 n 种数字,第 i 种数字是 ...

  4. bzoj4514: [Sdoi2016]数字配对--费用流

    看了一眼题目&数据范围,觉得应该是带下界的费用流 原来想拆点变成二分图,能配对的连边,跑二分图,可行性未知 后来看到另外一种解法.. 符合匹配要求的数要满足:质因子的个数相差为1,且两者可整除 ...

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

    4514: [Sdoi2016]数字配对 题意: 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,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]数字配对 费用流

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

  9. bzoj4514 数字配对

    思路 首先想到费用流. 对于每个点拆点.然后考虑我们怎样才能保证每个点只被用一次. 如果\(i\)与\(j\)满足条件.那么就从\(i\)向\(j\)连一条边并且从\(j\)向\(i\)连一条边.这样 ...

随机推荐

  1. SQL Server之存储过程基础知

    什么是存储过程呢?存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令. 通俗来讲:存储过程其实就是能完成一定操作的一组SQL语句. 那为什么要用存储过程呢?1.存储过程只在创造时进行编译, ...

  2. UVA 10192 Vacation

    裸最长公共子序列 #include<time.h> #include <cstdio> #include <iostream> #include<algori ...

  3. php 关联数据库的留言板练习

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. jquery学习笔记-----事件和动画

    一.ready机制 $(document).ready( function(){} ) $().ready( function(){} ) $( function(){} )  jquery的read ...

  5. Tensorflow 的Word2vec demo解析

    简单demo的代码路径在tensorflow\tensorflow\g3doc\tutorials\word2vec\word2vec_basic.py Sikp gram方式的model思路 htt ...

  6. 关于Java反射机制的几个问题

    >>如何在运行时确定对象类型 运行时类型识别(Run-time Type Identification, RTTI)主要有两种方式, 一种是在编译时和运行时已经知道了所有的类型,另外一种是 ...

  7. 如何做好App的引导页?(转)

    http://uedc.163.com/12264.html 当你第一次打开一款应用的时候常常会看到精美的引导页设计,它们在你未使用产品之前提前告知你产品的主要功能与特点,第一次印象的好坏会极大地影响 ...

  8. Oracle锁定和解锁用户的命令

    转:http://database.51cto.com/art/200910/158576.htm 在DBA的日常工作中,经常遇到为Oracle用户解锁的操作:这篇文章给出在命令行下进行Oracle用 ...

  9. 攻城狮在路上(壹) Hibernate(一)--- 软件环境、参考书目等一览表

    1.环境配置: web容器:tomcat6.0 JDK:1.7.0_51 hibernate:4.2.0.Final 操作系统:WIN8 64位 数据库:mysql  Ver 14.12 Distri ...

  10. android 入门-动画与容器

    set 动画容器 可作为资源id添加R.anim.xxxx   可用于在样式表中添加  http://blog.csdn.net/liuhe688/article/details/6660823 in ...