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

正题

题目链接:https://www.luogu.com.cn/problem/CF802C


题目大意

你有一个可以放kkk本书的书架,第iii天要求书架上有第aia_iai种书,购买第iii种书的价格为cic_ici

求满足nnn天要求的最小花费。

1≤n,k≤80,1≤ci≤1061\leq n,k\leq 80,1\leq c_i\leq 10^61n,k80,1ci106


解题思路

我们注意到每一天的限制是不能超过kkk本书延续到下一天。而书的保留我们可以考虑视为将一本书从这一天延续到下一次需要这本书的时候免费拿一本新的。

好那么现在相当于我们可以通过霸占一些区间来减少花费,但是一个格子最多被区间包含kkk次。

这和[NOI2008] 志愿者招募很像,考虑使用类似的建图。

首先我们要固定总流量为nnn,然后考虑怎么建图。这里将一个点拆为三部分记为p(x,1/2/3)p(x,1/2/3)p(x,1/2/3)

  1. 获取点,用来流过今天需要的书。
  2. 储存点,表示流过的这本书已经使用完了。
  3. 商店点,流过多余的流量,购买书时从这个点流过。

然后要实现以下功能

  • 要求满足每天的条件,我们让p(x,1)→p(x,2)p(x,1)\rightarrow p(x,2)p(x,1)p(x,2),流量为111,费用为−∞-\infty:表示每天的条件必须满足。
  • 延续这本书到下一个同样需求的点yyyp(x,2)→p(y,1)p(x,2)\rightarrow p(y,1)p(x,2)p(y,1),流量为111,费用为000:表示这本书用完之后可以留给后面的用。
  • 购买一本书,p(x,3)→p(x,1)p(x,3)\rightarrow p(x,1)p(x,3)p(x,1),流量为111,费用为caxc_{a_x}cax
  • 丢弃一本书,p(x,2)→p(x+1,3)p(x,2)\rightarrow p(x+1,3)p(x,2)p(x+1,3),流量为111,费用为000。因为这本书今天已经借出了所以需要占用空间,明天才能丢掉。
  • 限制存有书的数量不超过kkk:考虑到我们相当于总共有nnn点流量,在1/21/21/2类点之间的流量都相当于目前存在书柜里的,所以商店的书至少需要为n−kn-knk本。那么我们让p(x,3)→p(x+1,3)p(x,3)\rightarrow p(x+1,3)p(x,3)p(x+1,3)流量为n−kn-knk,费用为−∞-\infty,这样这些流量就必须流过了,然后再建立一条p(x,3)→p(x+1,3)p(x,3)\rightarrow p(x+1,3)p(x,3)p(x+1,3)流量为∞\infty,费用为000的给多余的流过就好了。

费用为−∞-\infty的我们设为一个很大的值,最后将答案把这些值加回去就好了。


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define ll long long
using namespace std;
const ll N=1e4+10,inf=1e9;
struct node{ll to,next,w,c;
}a[N<<1];
ll n,k,tot,ans,op[N],c[N],las[N];
ll s,t,ls[N],f[N],pre[N],mf[N];
bool v[N];queue<ll> q;
void addl(ll x,ll y,ll w,ll c){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;a[tot].w=w;a[tot].c=c;a[++tot].to=x;a[tot].next=ls[y];ls[y]=tot;a[tot].w=0;a[tot].c=-c;return;
}
bool SPFA(){memset(f,0x3f,sizeof(f));pre[t]=0;f[s]=0;q.push(s);v[s]=1;mf[s]=inf;while(!q.empty()){ll x=q.front();q.pop();v[x]=0;for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(a[i].w&&f[x]+a[i].c<f[y]){f[y]=f[x]+a[i].c;pre[y]=i;mf[y]=min(mf[x],a[i].w);if(!v[y])v[y]=1,q.push(y);}}}return pre[t];
}
ll update(){ll x=t;while(x!=s){a[pre[x]].w-=mf[t];a[pre[x]^1].w+=mf[t];x=a[pre[x]^1].to;}return mf[t]*f[t];
}
signed main()
{
//	freopen("bibliotheca.in","r",stdin);
//	freopen("bibliotheca.out","w",stdout);scanf("%lld%lld",&n,&k);tot=1;for(ll i=1;i<=n;i++)scanf("%lld",&op[i]);for(ll i=1;i<=n;i++)scanf("%lld",&c[i]);ll w=0;s=3*n+2;t=s+1;addl(s,2*n+1,n,0);for(ll i=1;i<=n;i++){if(las[op[i]])addl(las[op[i]]+n,i,1,0);else w=min(w+1,k);addl(i+2*n,i,1,c[op[i]]);addl(i,i+n,1,-inf);ans+=inf;addl(i+n,i+2*n+1,1,0);las[op[i]]=i;if(n>w){addl(i+2*n,i+2*n+1,n-w,-inf);ans+=(n-w)*inf;}addl(i+2*n,i+2*n+1,inf,0);}addl(3*n+1,t,n,0);int k=0;while(SPFA())ans+=update();printf("%lld\n",ans);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317594.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2019年1月已到,Java 8 要收费了吗?

根据此前开源中国发起的 Java 版本使用调查&#xff0c;国内的 Java 主力版本仍是 Java 8&#xff0c;有近 70% 的用户表示仍在使用 Java 8。所以对于「Java 8 是否要收费」这个问题&#xff0c;十分有必要阐述清楚&#xff0c;以消除不必要的恐慌。首先要明确一点&#xff0c;…

[NOI2007] 货币兑换 (dp+李超树维护凸包)

description 小Y最近在一家金券交易所工作。该金券交易所只发行交易两种金券&#xff1a;A纪念券&#xff08;以下简称A券&#xff09;和 B纪念券&#xff08;以下简称B券&#xff09;。每个持有金券的顾客都有一个自己的帐户。金券的数目可以是一个实数。每天随着市场的起伏波…

CF1379F1 Chess Strikes Back (easy version)(鸽笼原理、线段树)

解析 很神奇的一道题 关键在于把22的正方形看成一个单位的转化 由于每个22最多有一个国王 因此每个2*2都一定有一个国王 这是本题的关键 个人感觉这个思想很像鸽笼原理 至于后面的线段树就水到渠成了 代码 #include<bits/stdc.h> using namespace std; #define ll l…

[ZJOI2008]树的统计

[ZJOI2008]树的统计 题意&#xff1a; 题解&#xff1a; 树链剖分模板题&#xff0c;好久没打都忘了 代码&#xff1a; #include <algorithm> #include <cstdio> #include <cstring> #define lc o << 1 #define rc o << 1 | 1 const int max…

AT3860-[AGC020F]Arcs on a Circle【dp】

正题 题目链接:https://www.luogu.com.cn/problem/AT3860 题目大意 有一个周长为mmm的圆&#xff0c;nnn条线段&#xff0c;第iii条长度为aia_iai​&#xff0c;将线段贴在圆的随机位置上&#xff0c;求整个圆都被覆盖的概率。 1≤n≤6,1≤m≤501\leq n\leq 6,1\leq m\le 501…

带你学习AOP框架之Aspect.Core[1]

在软件业&#xff0c;AOP为Aspect Oriented Programming的缩写&#xff0c;意为&#xff1a;面向切面编程&#xff0c;通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续&#xff0c;是软件开发中的一个热点&#xff0c;是函数式编程的一种衍生…

「雅礼集训 2017 Day7」事情的相似度(后缀自动机+LCT+树状数组)

description 点击查看题目内容 solution Step1 无脑建SAMSAMSAM 两个前缀的最长公共后缀就是parent−treeparent-treeparent−tree上两点的lcalcalca&#xff0c;定义知显然 Step2 离线询问&#xff0c;按右端点从小到大排序 Step3 每加入一个字母&#xff0c;就将tatata在p…

CF1396B Stoned Game(博弈论)

解析 上午模拟被博弈论虐&#xff0c;下午被黄色的博弈论虐 qwq 首先的一个结论是&#xff1a; 如果有一堆超过总体的一半&#xff0c;那么先手只需要守住这堆就稳赢了 如果没有这样的一堆&#xff0c;可以证明&#xff0c;最后一定可以全部拿完 假设最后有一堆k没拿完&…

主席树

大一寒假的时候学了主席树&#xff0c;当时还录了视频发b站上&#xff0c;过了好久没用都忘了差不多 这篇文章讲的非常详细&#xff0c;我就直接借用过来 静态主席树 总结一下就是&#xff1a; 代码&#xff1a; 对于每一种状态建立一个线段树&#xff0c;为了防止mle&#xf…

P7735-[NOI2021]轻重边【树链剖分,线段树】

前言 之前线上赛就A的题现在才写博客 正题 题目链接:https://www.luogu.com.cn/problem/P7735 题目大意 有nnn个点的一棵树&#xff0c;开始所有边都是轻边&#xff0c;mmm次操作。 把x→yx\rightarrow yx→y路径上所有点连接的重边都变为轻边&#xff0c;然后再把路径上的…

.NET Core实战项目之CMS 第十六章 用户登录及验证码功能实现

前面为了方便我们只是简单实现了基本业务功能的增删改查&#xff0c;但是登录功能还没有实现&#xff0c;而登录又是系统所必须的&#xff0c;得益于 ASP.NET Core的可扩展性因此我们很容易实现我们的登录功能。今天我将带着大家一起来实现下我们的ASP.NET Core2.2开发的CMS系统…

CF508D Tanya and Password(欧拉回路)

解析 之前模拟考过的一道题 把字符串当成前后缀之间的连边即可 注意即使图的度数符合要求&#xff0c;也可能由于不连通而无解&#xff0c;需要再特判一下 #include<bits/stdc.h> using namespace std; #define ll long long #define ull unsigned long long const int…

[HEOI2016/TJOI2016]字符串 (后缀数组+主席树+二分)

description 佳媛姐姐过生日的时候&#xff0c;她的小伙伴从某东上买了一个生日礼物。生日礼物放在一个神奇的箱子中。箱子外边写了一个长为 n 的字符串 s&#xff0c;和 m 个问题。佳媛姐姐必须正确回答这 m 个问题&#xff0c;才能打开箱子拿到礼物&#xff0c;升职加薪&…

[SDOI2014]旅行

[SDOI2014]旅行 题意&#xff1a; n个城市&#xff0c;n-1条边&#xff0c;任意两个城市互通&#xff0c;每个城市有所信奉的宗教和城市评级&#xff0c;有四种指令&#xff1a; 1.将城市x的居民改信为c教 2.将城市x的评级调整为w 3.统计x到y&#xff0c;路上所有的城市的评级…

YbtOJ-染色计划【树链剖分,线段树,tarjan】

正题 题目大意 给出nnn个点的一棵树&#xff0c;每个点有个颜色aia_iai​&#xff0c;你每次可以选择一个颜色全部变成另一个颜色。 求最少多少次操作可以把一种颜色变成一个完整的连通块。 1≤k≤n≤21051\leq k\leq n\leq 2\times 10^51≤k≤n≤2105 解题思路 考虑如果我们…

张高兴的 .NET Core IoT 入门指南:环境配置、Blink、部署

如何在 Raspberry Pi 的 Raspbian 上构建使用 GPIO 引脚的 IoT 程序&#xff1f;你可能会回答使用 C 或 Python 去访问 Raspberry Pi 的引脚。现在&#xff0c;C# 程序员可以使用 .NET Core 在 Raspbian(Linux) 上构建 IoT 应用程序。只需要引入 System.Device.GPIONuGet 包即可…

CF183C:Diverse Permutation(构造)

解析 首先考虑如何构造kn-1的情况 发现令排列为1,n,2,n-1…即可 那么在k不等于n-1时 只需要让前k项与上面的序列相同&#xff0c;后面公差为1即可 代码 #include<bits/stdc.h> using namespace std; #define ll long long #define ull unsigned long long const int N…

CF603E-Pastoral Oddities【CDQ分治,可撤销并查集】

正题 题目链接:https://www.luogu.com.cn/problem/CF603E 题目大意 开始时有nnn个点&#xff0c;没有边。 依次加入mmm条带权的边&#xff0c;每次加入后询问是否存在一个边集&#xff0c;满足每个点的度数均为奇数&#xff0c;求使得这个边集的最大权值最小。 1≤n≤105,1≤…

2020ICPC 江西省大学生程序设计竞赛

2020ICPC 江西省大学生程序设计竞赛

在AspNetMvc中使用日志面板. Logdashboard 1.1beta

Logdashboard是Net下的日志面板,它支持AspNet与AspNetCore项目。关于更多LogDashboard的介绍请看这里--使用logdashboard查看可视化日志。就在刚刚LogDashboard发布了1.1的beta版,在这个版本中有以下变化https://github.com/liangshiw/LogDashboard/releases支持NetFramework的…