3838: [Pa2013]Raper

Time Limit: 60 Sec  Memory Limit: 128 MB
Submit: 53  Solved: 27
[Submit][Status][Discuss]

Description

你需要生产k张光盘。每张光盘需要经过两道工序:先在A工厂进行挤压,然后送到B工厂涂上反光层。
共有n天时间,你知道每天A,B两家工厂的收费。一家工厂一天只能对一张光盘进行操作。同一天内一张光盘先后在A,B工厂被操作是允许的。你可以假定将只经过A操作的半成品暂存起来不需花费额外代价。
求出生产k张光盘的最小总花费。

Input

第一行两个整数n,k(1<=k<=n<=500000)。
第二行n个整数,表示A工厂每天的收费。
第三行n个整数,表示B工厂每天的收费。(收费均不超过10^9)

Output

输出最小总花费。

Sample Input

8 4
3 8 7 9 9 4 6 8
2 5 9 4 3 8 9 1

Sample Output

32
样例解释:
第一张盘:第1天A,第1天B。
第二张盘:第2天A,第4天B。
第三张盘:第3天A,第5天B。
第四张盘:第6天A,第8天B。

HINT

Source

[Submit][Status][Discuss]

题解:线段树

这道题一直在纠结要不要写题解,表示想了一个上午都没想出来怎么做。最后看的Claris的题解,看了半天才反映过来。。。。

首先我们把a看成左括号,b看成右括号,那么对于一个位置我们如果选择左括号就在这个位置+1,选择右括号就在这个位置-1,那么我们的选择其实就是要形成一个合法的括号序列,使任意位置的前缀和都>=0

对于合法的序列,我们现在要插入一对括号,无非有两种选择(先说明B代表)的位置,A代表(的位置):

(1)插入(),那么对于整个序列来说,[A,B-1]这个区间的前缀和都+1,对于这种插入来说只要两个位置的括号没有使用过就可以插入,也比较好维护

(2)插入)(,那么对于整个序列来说,[B,A-1]这个区间的前缀和都-1,因为一个合法的括号序列满足任意位置的前缀和都>=0,所以[B,A-1]的区间前缀和的最小值>0

那么考虑怎么用线段树维护。。。其实还是挺麻烦的。

va:表示插入一对未使用过的()的最小代价和

vb: 表示插入一对未使用过的)(且满足[B,A-1]的区间最小值大于线段树该结点对应的区间的最小值的最小代价和。

vc: 表示插入一对未使用过的)(的最小代价和

注意va,vb,vc都是结构体,我们虽然是要维护最小代价和,但是因为牵扯到后面的修改,所以我们维护的实际是左右括号的出现位置。vc维护的意义在于合并,因为vc在当前区间可能是不合法的,但是网上合并的时候会出现新的最小值,使vc可以成为大区间满足条件的选择

tr:维护区间前缀和的最小值

delta:维护区间的修改标记

aa:区间a的最小代价,实际维护的还是位置(下同)

ab:区间b的最小代价。

ba:满足[st,A-1]的最小值大于[st,end]的最小值的区间a的最小代价

bb:满足[B,end]的最小值大于[st,end]的最小值的区间b的最小代价

在进行区间合并的时候,我们可以通过组合确定出新的)(的合法选择,具体的做法需要在合并的时候分类讨论。

我们加入A[0]=inf,B[0]=inf,那么区间(0,n]的vb一定是合法的选择,因为任意位置的前缀和和大于等于0嘛。

那么选出的vb必然是>0的啊。

然后每次选出一对括号后就将对应位置的权值改成inf,因为一个括号不能重复使用,然后将包含该位置的所有路径上的值进行重新计算。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define N 500003
#define inf 1000000003
#define LL long long
using namespace std;
int n,m,k;
int a[N],b[N],aa[N*4],ab[N*4],ba[N*4],bb[N*4],tr[N*4],delta[N*4];
struct data{int x,y;data(int X=0,int Y=0) {x=X,y=Y;} data operator +(const data &b1) {return (a[x]+b[y]<a[b1.x]+b[b1.y])?(*this):b1;}
}va[N*4],vb[N*4],vc[N*4];
void update(int x)
{int l=x<<1; int r=x<<1|1;va[x]=va[l]+va[r]+data(aa[l],ab[r]);//维护可插入的()最小值的出现位置 vc[x]=vc[l]+vc[r]+data(aa[r],ab[l]);//维护)(最小值的出现位置,对于当前区间不一定是合法的插入 vb[x]=vb[l]+vb[r];//维护)(最小值,且[B,A-1]的区间最小值大于[st,en]的区间最小值出现位置 aa[x]=a[aa[l]]<a[aa[r]]?aa[l]:aa[r];//维护区间中a的最小值 ab[x]=b[ab[l]]<b[ab[r]]?ab[l]:ab[r];//维护区间中b的最小值 if (tr[l]<tr[r]) {//tr记录的是当前位置的前缀和,对于一个位置插入)相当于-1,插入(相当于+1 vb[x]=vb[x]+vc[r]+data(aa[r],bb[l]);ba[x]=ba[l];//维护满足[st,A-1]的区间最小值大于[st,en]的区间最小值的代价最小的A的位置 bb[x]=b[ab[r]]<b[bb[l]]?ab[r]:bb[l];//维护满足[B,en]的区间最小值大于[st,en]的区间最小值的代价最小的B的位置 tr[x]=tr[l];}if (tr[l]>tr[r]) {vb[x]=vb[x]+vc[l]+data(ba[r],ab[l]);ba[x]=a[aa[l]]<a[ba[r]]?aa[l]:ba[r];bb[x]=bb[r];tr[x]=tr[r];}if (tr[l]==tr[r]) {vb[x]=vb[x]+data(ba[r],bb[l]);ba[x]=ba[l];bb[x]=bb[r];tr[x]=tr[l];}
}
void build(int now,int l,int r)
{if (l==r) {va[now]=vc[now]=data(l,l); vb[now]=data(0,0);aa[now]=ab[now]=ba[now]=l;return;} int mid=(l+r)/2;build(now<<1,l,mid); build(now<<1|1,mid+1,r);update(now);
}
void pushdown(int now)
{if (delta[now]) {delta[now<<1]+=delta[now];delta[now<<1|1]+=delta[now];tr[now<<1]+=delta[now];tr[now<<1|1]+=delta[now];delta[now]=0;}
}
void qjchange(int now,int l,int r,int ll,int rr,int val)
{if (ll<=l&&r<=rr) {tr[now]+=val;delta[now]+=val;return;}pushdown(now);int mid=(l+r)/2;if (ll<=mid) qjchange(now<<1,l,mid,ll,rr,val);if (rr>mid) qjchange(now<<1|1,mid+1,r,ll,rr,val);update(now);
}
void pointchange(int now,int l,int r,int x)
{if (l==r) return;pushdown(now);int mid=(l+r)/2;if (x<=mid) pointchange(now<<1,l,mid,x);else pointchange(now<<1|1,mid+1,r,x);update(now);
}
int main()
{freopen("a.in","r",stdin);freopen("my.out","w",stdout);scanf("%d%d",&n,&k);for (int i=1;i<=n;i++) scanf("%d",&a[i]);for (int i=1;i<=n;i++) scanf("%d",&b[i]);a[0]=b[0]=inf;build(1,0,n); LL ans=0;for (int i=1;i<=k;i++) {data t=va[1]+vb[1];ans+=(LL)a[t.x]+b[t.y];if (t.x<t.y) qjchange(1,0,n,t.x,t.y-1,1);if (t.x>t.y) qjchange(1,0,n,t.y,t.x-1,-1);a[t.x]=inf; b[t.y]=inf;pointchange(1,0,n,t.x); pointchange(1,0,n,t.y);}printf("%I64d\n",ans);
}

bzoj 3838: [Pa2013]Raper (线段树)相关推荐

  1. BZOJ.1558.[JSOI2009]等差数列(线段树 差分)

    BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...

  2. BZOJ 2124 等差子序列 线段树维护哈希

    $ \Rightarrow $ 戳我进BZOJ原题 等差子序列 Time Limit: 3 Sec $ \quad $ Memory Limit: 259 MB Description 给一个 $ 1 ...

  3. BZOJ.3938.Robot(李超线段树)

    BZOJ UOJ 以时间\(t\)为横坐标,位置\(p\)为纵坐标建坐标系,那每个机器人就是一条\(0\sim INF\)的折线. 用李超线段树维护最大最小值.对于折线分成若干条线段依次插入即可. 最 ...

  4. BZOJ 4422 Cow Confinement (线段树、DP、扫描线、差分)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=4422 我真服了..这题我能调一天半,最后还是对拍拍出来的...脑子还是有病啊 题解: ...

  5. BZOJ 1135 [POI2009]Lyz 线段树

    题意:链接 方法:线段树维护子区间最值. 解析: 我们可以推出来一个式子. 就是如果满足题意的话. 那么任意一个子区间[l,r] f[i]表示穿i的鞋的人数 (r−l+1+d)∗k>=∑f[i] ...

  6. BZOJ[1135][POI2009]Lyz 线段树

    传送门ber~ 如果某时不合法,那一定存在某段满足 (r−l+1+d)∗k<Σl≤i≤rnumi(r−l+1+d)∗k<Σl≤i≤rnumi (r-l+1+d)*k (其中 numinum ...

  7. bzoj 1503 (权值线段树)

    由于蒟蒻实在是ttttttai 菜了,于是开始了学习主席树,权值线段树作为主席树的前置知识,于是蒟蒻各种百度百度,谷歌谷歌,抄网上的代码,然后终于A了这个题目.也还算是有一点收获. 题目:芝麻开门 题 ...

  8. [FJOI 2016]bzoj 4408 神秘数 - 线段树

    题目大意:给你一列数,多次询问用一个区间的数字形成一个可重集合,最小的不能被表示为其一个子集的数字是多少. 题解:考虑给你一个可重集合你怎么算:从小到大排序,假设用前x个数字不能表示的最小都数字是an ...

  9. BZOJ.4821.[SDOI2017]相关分析(线段树)

    BZOJ LOJ 洛谷 恶心的拆式子..然后就是要维护\(\sum x_i,\ \sum y_i,\ \sum x_iy_i,\ \sum x_i^2\). 操作三可以看成初始化一遍,然后同操作二. ...

最新文章

  1. Java要掌握哪些技术才能顺利找到工作?分享这6项
  2. Entity Framework 5.0 Code First全面学习
  3. Martix工作室考核题 —— 2019-3-8 第一题
  4. 用Python分析了20万场吃鸡数据,有不少有趣的发现
  5. python 库 全局变量_python局部变量和全局变量global
  6. c语言a 寻路算法,JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法完整实例
  7. 每日一题(13)—— #includefile.h 与 #include “file”的区别
  8. mysql数据库删除列数据_MySQL数据库-数据表、以及列的增删改查
  9. 最短路径问题总结,时间复杂度,空间复杂度对比(JAVA)
  10. 开发中为组件添加预览信息
  11. XML 文档结构必须从头至尾包含在同一个实体内
  12. 概要设计的作用_【教育年会与颁奖典礼】第六届中国人居环境设计学年奖
  13. Centos7 镜像资源下载
  14. nvivo服务器项目,【NVivo教程】在Nvivo中设置案例路线图
  15. 告别手机自带浏览器,分享2022年好用的手机浏览器
  16. 软件测试面试题整理(四)之接口测试篇
  17. appium自动注册完整脚本
  18. 统计字符串中字符ch出现的次数c语言,C语言与汇编的嵌入式编程:统计字符串中各字符出现的次数...
  19. 10月11日科技联播:美股暴跌引全球股市崩盘;腾讯跌出全球市值前十
  20. 移动通信电波传播及损耗(二)

热门文章

  1. AIX对硬件在线做diag诊断
  2. java标签outer,java outer
  3. activiti实现的请假流程
  4. 微信公众号图片素材一键删除小工具
  5. 学微积,用手机,人人“知识共享”学真知
  6. 《嵌入式 - 模块》RW007 WIFI模块联网与使用(一)
  7. 消愁计算机数字按键,明日之后2019最新钢琴谱数字编码顺序大全:纸短情长、起风了、往后余生[多图]...
  8. Mockplus是如何节省你的原型时间的?
  9. 英语日常口语对话(2)
  10. 史上最全《JMeter压力测试教程》——通俗易懂,3天即可学会