题目链接


复习了下餐巾计划问题。全忘了=-=

首先这是一道网络流。然后本题有\(n\)种建图方法,以及\(smy\) dalao还有单纯形做法。

先假设所有物品都是买入的。那么对于每一天,拆成两个点\(i,i'\),\(S\to i\)连边\((1,cost_{a_i})\)(容量\(1\)费用\(cost_{a_i}\)),\(i'\to T\)连边\((1,0)\),\(i\to i'\)连边\((1,0)\)。这样就能满足一些基本要求了。

然后考虑可以把某个\(a_i\)留到之后一天。考虑从\(i-1\)向\(a_i\)上次出现的位置\(las_{a_i}\)连边,容量\(1\)费用\(-cost_{a_i}\);\(i\to i+1\)连边\((k-1,0)\)。\(las_{a_i}\)那一天的流量可以流到\(i-1\)再流回\(las_{a_i}'\),退回\(cost_{a_i}\)的钱。

边的含义是,表示允许保留\(k-1\)种物品在架子上(必须要保留当前物品所以是\(k-1\))。当前物品的流量在\(i\)已经有了,所以让\(a_i\)上次的流量通过\(i-1\)流回去。


  1. //31ms 100KB
  2. #include <queue>
  3. #include <cstdio>
  4. #include <cctype>
  5. #include <cstring>
  6. #include <algorithm>
  7. #define S 0
  8. #define gc() getchar()
  9. typedef long long LL;
  10. const int N=407,M=N*5,INF=0x3f3f3f3f;
  11. int Cost,T,A[N],c[N],las[N],H[N],Enum,nxt[M],to[M],cap[M],cost[M],dis[N],cur[N];
  12. bool vis[N];
  13. inline int read()
  14. {
  15. int now=0;register char c=gc();
  16. for(;!isdigit(c);c=gc());
  17. for(;isdigit(c);now=now*10+c-48,c=gc());
  18. return now;
  19. }
  20. inline void AE(int u,int v,int w,int c)
  21. {
  22. to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum, cap[Enum]=w, cost[Enum]=c;
  23. to[++Enum]=u, nxt[Enum]=H[v], H[v]=Enum, cap[Enum]=0, cost[Enum]=-c;
  24. }
  25. bool SPFA()
  26. {
  27. static bool inq[N];
  28. static std::queue<int> q;
  29. memset(inq,0,T+1), memset(dis,0x3f,T+1<<2);
  30. dis[S]=0, q.push(0);
  31. while(!q.empty())
  32. {
  33. int x=q.front(); q.pop();
  34. inq[x]=0;
  35. for(int i=H[x],v; i; i=nxt[i])
  36. if(cap[i]&&dis[v=to[i]]>dis[x]+cost[i])
  37. dis[v]=dis[x]+cost[i], !inq[v]&&(q.push(v),inq[v]=1);
  38. }
  39. return dis[T]<INF;
  40. }
  41. bool DFS(int x)
  42. {
  43. if(x==T) return 1;
  44. vis[x]=1;
  45. for(int &i=cur[x],v; i; i=nxt[i])
  46. if(!vis[v=to[i]]&&cap[i]&&dis[v]==dis[x]+cost[i]&&DFS(v))
  47. return --cap[i],++cap[i^1],Cost+=cost[i],1;
  48. return 0;
  49. }
  50. int MCMF()
  51. {
  52. while(SPFA())
  53. {
  54. memset(vis,0,T+1), memcpy(cur,H,T+1<<2);
  55. while(DFS(S));
  56. }
  57. return Cost;
  58. }
  59. int main()
  60. {
  61. // freopen("B.in","r",stdin);
  62. // freopen("B.out","w",stdout);
  63. int n=read(),K=read(); Enum=1, T=n<<1|1;
  64. for(int i=1; i<=n; ++i) A[i]=read();
  65. for(int i=1; i<=n; ++i) c[i]=read();
  66. for(int i=1; i<=n; ++i)
  67. {
  68. AE(S,i,1,c[A[i]]), AE(i,i+n,1,0), AE(i+n,T,1,0);
  69. if(i<n&&K>1) AE(i,i+1,K-1,0);
  70. if(las[A[i]]) AE(i-1,las[A[i]]+n,1,-c[A[i]]);
  71. las[A[i]]=i;
  72. }
  73. printf("%d\n",MCMF());
  74. return 0;
  75. }

CF.802C.Heidi and Library (hard) (费用流zkw)的更多相关文章

  1. 【CF802C】Heidi and Library (hard) 费用流

    [CF802C]Heidi and Library (hard) 题意:有n个人依次来借书,第i人来的时候要求书店里必须有种类为ai的书,种类为i的书要花费ci块钱购入.而书店的容量只有k,多余的书只 ...

  2. CF802C Heidi and Library hard 费用流 区间k覆盖问题

    LINK:Heidi and Library 先说一下简单版本的 就是权值都为1. 一直无脑加书 然后发现会引起冲突,可以发现此时需要扔掉一本书. 扔掉的话 可以考虑扔掉哪一本是最优的 可以发现扔掉n ...

  3. [模板] 网络流相关/最大流ISAP/费用流zkw

    最大流/ISAP 话说ISAP是真快...(大多数情况)吊打dinic,而且还好写... 大概思路就是: 在dinic的基础上, 动态修改层数, 如果终点层数 \(>\) 点数, break. ...

  4. CSU 1948: 超级管理员(普通费用流&&zkw费用流)

    Description 长者对小明施加了膜法,使得小明每天起床就像马丁的早晨一样. 今天小明早上醒来发现自己成了一位仓管员.仓库可以被描述为一个n × m的网格,在每个网格上有几个箱子(可能没有).为 ...

  5. BZOJ2673 [Wf2011]Chips Challenge 费用流 zkw费用流 网络流

    https://darkbzoj.cf/problem/2673 有一个芯片,芯片上有N*N(1≤N≤40)个插槽,可以在里面装零件. 有些插槽不能装零件,有些插槽必须装零件,剩下的插槽随意. 要求装 ...

  6. BZOJ.2597.[WC2007]剪刀石头布(费用流zkw)

    BZOJ 洛谷 \(Description\) 给定一张部分边方向已确定的竞赛图.你需要给剩下的边确定方向,使得图中的三元环数量最多. \(n\leq100\). \(Solution\) 这种选择之 ...

  7. BZOJ.5120.[清华集训2017]无限之环(费用流zkw 黑白染色)

    题目链接 LOJ 洛谷 容易想到最小费用最大流分配度数. 因为水管形态固定,每个点还是要拆成4个点,分别当前格子表示向上右下左方向. 然后能比较容易地得到每种状态向其它状态转移的费用(比如原向上的可以 ...

  8. BZOJ.2668.[CQOI2012]交换棋子(费用流zkw)

    题目链接 首先黑白棋子的交换等价于黑棋子在白格子图上移动,都到达指定位置. 在这假设我们知道这题用网络流做. 那么黑棋到指定位置就是一条路径,考虑怎么用流模拟出这条路径. 我们发现除了路径的起点和终点 ...

  9. LOJ.6068.[2017山东一轮集训Day4]棋盘(费用流zkw)

    题目链接 考虑两个\(\#\)之间产生的花费是怎样的.设这之间放了\(k\)个棋子,花费是\(\frac{k(k-1)}{2}\). 在\((r,c)\)处放棋子,行和列会同时产生花费,且花费和该行该 ...

随机推荐

  1. SimpleDateFormat 线程不安全及解决方案

    SimpleDateFormat定义 SimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类.它允许进行格式化(日期 -> 文本).解析(文本 -> 日期 ...

  2. Virtualbox Ubuntu 虚拟机命令行挂载共享文件夹及设置静态IP

    挂载共享文件夹 参考 [1], VirtualBox/GuestAdditions [2], VirtualBox/SharedFolders 步骤 在Virtualbox 虚拟机的菜单『设备』中,点 ...

  3. docker安装redis

    查询镜像 docker search redis 拉取镜像 docker pull redis 启动容器 docker run --name redis -p 6379:6379 -d --resta ...

  4. centos7 nginx配置ssl证书实现https访问同时http访问

    1,首先将你申请到的nginx 分类下的ssl证书上传到nginx的config下(可以新建一个目录叫ssl.) 2.修改nginx的config配置 server {listen 80;(监听80端 ...

  5. 「luogu4462」[CQOI2018] 异或序列

    「luogu4462」[CQOI2018]异或序列 一句话题意 输入 \(n\) 个数,给定\(k\),共 \(m\) 组询问,输出第 \(i\) 组询问 \(l_i\) \(r_i\) 中有多少个连 ...

  6. 微信中音乐播放在ios不能自动播放解决

    在微信中,ios手机下面音乐被自动禁掉无法自动播放,我们可以执行触发body上的元素,自动进行播放. //音乐 var x = document.getElementById("myAudi ...

  7. bently addin 二次开发学习

    元素结构: 一些基本元素的添加与绘制: class CreateElement { public static void LineAndLineString() { Application app = ...

  8. Python 爬虫-进阶开发之路

    第一篇:爬虫基本原理: HTTP, 爬虫基础 第二篇:环境安装与搭建: 第三篇:网页抓取:urllib,requests,aiohttp , selenium,  appium 第四篇:网页解析:re ...

  9. tensorflow--mnist注解

    我自己对mnist官方例程进行了部分注解,希望分享出来有助于入门选手更好理解tensorflow的运行机制,可以拷贝到IDE再调试看看,看看具体数据流向还有一部分tensorflow里面用到的库.我用 ...

  10. C# EntityFramework Code First 迁移 降级 回退到空数据库

    C# EntityFramework  Code First 迁移 降级 回退到空数据库 1.包管理器控制台-迁移 在包管理器控制台中运行 Enable-Migrations Add-Migratio ...