今年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]数字配对[费用流]的更多相关文章

  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. UIScrollView控件实现图片缩放功能

    转发自:http://www.cnblogs.com/wendingding/p/3754268.html 一.缩放 1.简单说明: 有些时候,我们可能要对某些内容进行手势缩放,如下图所示 UIScr ...

  2. Java自定义注解开发

    一.背景 最近在自己搞一个项目时,遇到可需要开发自定义注解的需求,对于没有怎么关注这些java新特性的来说,比较尴尬,索性就拿出一些时间,来进行研究下自定义注解开发的步骤以及使用方式.今天在这里记下, ...

  3. iOS键盘监听的通知

    #pragma mark - 键盘通知回调方法 //  监听键盘的通知 [[NSNotificationCenter defaultCenter] addObserver:self selector: ...

  4. springMVC创建基础变量

    在springMVC中有一些变量是基础变量,可以在全局多个地方使用,在修改规则的时候,这样只用修改一个地方就好了,而且可以避免很多不必要的bug出现下面就来总结一下在我的项目中如何去创建一个全局基础变 ...

  5. Mysql控制语句

    14.6.5.1 CASE Syntax 14.6.5.2 IF Syntax 14.6.5.3 ITERATE Syntax 14.6.5.4 LEAVE Syntax 14.6.5.5 LOOP ...

  6. sehll_if

    -s file 文件大小非0时为真 [ -f "somefile" ] :判断是否是一个文件[ -x "/bin/ls" ] :判断/bin/ls是否存在并有可 ...

  7. 《孙子算经》之"物不知数"题:中国剩余定理

    1.<孙子算经>之"物不知数"题 今有物不知其数,三三数之剩二,五五数之剩七,七七数之剩二,问物几何? 2.中国剩余定理 定义: 设 a,b,m 都是整数.  如果 m ...

  8. UML类图五种关系与代码的对应关系

    转: UML类图中的五种关系的耦合强弱比较:依赖<关联<聚合<组合<继承 一.依赖关系: (一)说明 虚线+箭头 可描述为:Uses a 依赖是类的五种关系中耦合最小的一种关系 ...

  9. python多进程程序之间交换数据的两种办法--Queue和Pipe

    合在一起作的测试. #!/usr/bin/env python # -*- coding: utf-8 -*- import multiprocessing import random import ...

  10. python threading编程中的LOCK和RLOCK(可重入锁)

    找到一本PYTHON并发编辑的书, 弄弄.. #!/usr/bin/env python # -*- coding: utf-8 -*- import threading import time sh ...