记$len_{i}=r_{i}-l_{i}$,即第$i$个区间的长度

用$f_{i,j}$表示前$i$个区间合法,第$i$个区间位于$[j,j+len_{i}]$的最小代价,暴力dp的时间复杂度为$o(nL^{2})$

考虑$f_{i,j}$的转移,即$f_{i,j}=\min_{[j,j+len_{i}]\cap[k,k+len_{i-1}]\ne \empty}f_{i-1,k}+|j-l_{i}|$

不难证明,这样的$k$是一段连续区间,可以表示为$[j-x,j+y]$($x,y\ge 0$)

接下来,对每一个$i$,若将$f_{i,j}$看成关于$j$的函数且用直线连结相邻点,那么可以证明其具有凸性

考虑归纳,更严谨的描述是:令$f'_{i,j}=f_{i,j}-f_{i,j+1}$,证明$f'_{i,j}$单调不递增

记$[x_{0},y_{0})$为$f'_{i,j}=0$的区间($[x,y]$就是$f_{i,j}$最小值的区间),根据凸性来考虑其最小值的位置——

1.$j\in [x_{0}-y,y_{0}+x]$,最小值位于$f_{i-1,x_{0}}$(即原来最小值)

2.$j<x_{0}-y$,最小值位于$f_{i-1,j-x}$

3.$j>y_{0}+x$,最小值位于$f_{i-1,j+y}$

可以发现,这等价于将$(-\infty,x_{0}]$向左移动$y$格,将$[y_{0},\infty)$向右移动$x$格,空出来的部分仍然取最小值

这是有凸性的,再加上一个绝对值函数,显然仍然具有凸性,因此即证明了该结论

考虑这件事情如何维护,记$a_{k}$为第小的$j$满足$f'_{i,j}\ge k$的$j$(特别的,$a_{i}=-\infty$),将$a[0,i)$与$a[-i,0)$分别用一个set维护,分别考虑移动和加入绝对值:

(不难发现$x_{0}=a_{0}$,$y_{0}=a_{-1}$)

1.移动是比较容易的,分别记录一个懒标记即可

2.考虑加入一个$|j-l_{i}|$,将其与$[x_{0},y_{0}]$分类讨论:

(1)$l_{i}\in [x_{0},y_{0})$,相当于将$a[0,i)$右移一位,之后加入$f'_{i,l_{i}}=-1$,即$a_{0}=a_{-1}=l_{i}$(其余位置由于用set维护,不需要实际去移动它);

(2)$l_{i}<x_{0}$,相当于将两个$l_{i}$(由于左加1自身减1会导致一个值不存在,也加到$l_{i}$上)加入左边的集合,并将$a_{0}$移动到右边

(3)$l_{i}>y_{0}$,类似的,即将两个$l_{i}$加入右边,并将$a_{-1}$移动到左边

关于最后的答案,不断维护最小值上的值即可

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 100005
4 #define ll long long
5 multiset<ll>vl,vr;
6 int n,l[N],r[N];
7 ll tagl,tagr,ans;
8 int main(){
9 scanf("%d",&n);
10 for(int i=1;i<=n;i++)scanf("%d%d",&l[i],&r[i]);
11 vl.insert(l[1]);
12 vr.insert(l[1]);
13 for(int i=2;i<=n;i++){
14 int x=r[i-1]-l[i-1],y=r[i]-l[i];
15 tagl-=y;
16 tagr+=x;
17 ll x0=(*--vl.end())+tagl,y0=(*vr.begin())+tagr;
18 if ((x0<=l[i])&&(l[i]<y0)){
19 vl.insert(l[i]-tagl);
20 vr.insert(l[i]-tagr);
21 }
22 else{
23 if (l[i]<x0){
24 ans+=x0-l[i];
25 vl.insert(l[i]-tagl);
26 vl.insert(l[i]-tagl);
27 vl.erase(--vl.end());
28 vr.insert(x0-tagr);
29 }
30 else{
31 ans+=l[i]-y0;
32 vr.insert(l[i]-tagr);
33 vr.insert(l[i]-tagr);
34 vr.erase(vr.begin());
35 vl.insert(y0-tagl);
36 }
37 }
38 }
39 printf("%lld",ans);
40 }

[atARC070E]NarrowRectangles的更多相关文章

  1. AT2347 [ARC070C] NarrowRectangles

    首先不难看出一个暴力的 \(dp\) 解法,考虑令 \(dp_{i, j}\) 表示考虑完前 \(i\) 个矩形,第 \(i\) 个矩形左端点在 \(j\) 时所需要的最小花费. 不难有转移: \[d ...

  2. AtCoder刷题记录

    构造题都是神仙题 /kk ARC066C Addition and Subtraction Hard 首先要发现两个性质: 加号右边不会有括号:显然,有括号也可以被删去,答案不变. \(op_i\)和 ...

  3. 【AtCoder】ARC070

    ARC070 C - Go Home 题目大意:一只袋鼠第i秒可以向左或向右跳i步或者不跳,问从0跳到x的最小时间 就是1,2,3,4...k总和超过x的最小的k,因为如果超过了x的那部分需要减掉的那 ...

随机推荐

  1. 利用Jackson序列化实现数据脱敏

    几天前使用了Jackson对数据的自定义序列化.突发灵感,利用此方法来简单实现接口返回数据脱敏,故写此文记录. 核心思想是利用Jackson的StdSerializer,@JsonSerialize, ...

  2. TypeScript 枚举指南

    枚举是受 TypeScript 支持的数据类型.枚举允许您定义一组命名常量.使用它们可以更轻松地记录意图或创建一组不同的案例.枚举大多数用于面向对象的编程语言(如 Java 和 C#)中,现在也可以 ...

  3. 倒计时 | 7.24 阿里云 Serverless Developer Meetup 杭州站报名火热进行中!

    本周六阿里云 Serverless Developer Meetup 即将亮相杭州 ​ 时间:7.24 本周六 13:30 - 17:30 地点:杭州市良睦路 999 号乐佳国际 1-3-7 特洛伊星 ...

  4. 简单几步零成本使用Vercel部署OneIndex 无需服务器搭建基于OneDrive的网盘

    前提 你需要一个OneDrive账号,必须管理员开放API 需要已安装Node.js 拥有Github账号,没有就注册一个 魔法上网环境(看情况) 注册应用 登录https://portal.azur ...

  5. noj -> 跳马

    00 题目 描述: 在国际象棋中,马的走法与中车象棋类似,即俗话说的"马走日",下图所示即国际象棋中马(K)在一步能到达的格子(其中黑色的格子是能到达的位置). 现有一200*20 ...

  6. 【UE4 C++】UKismetSystemLibrary 源代码

    // Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" # ...

  7. .Net 5下的单文件部署

    由于.net程序没有静态链接,一直缺乏单文件部署这种干净的发布方案.对客户端程序发布并不是很友好.在之前的.net framework下,有ILMerge合并程序集,以及LibZ的嵌入资源文件等第三方 ...

  8. [对对子队]Beta阶段项目展示博客

    Beta阶段项目展示博客 1 团队成员的简介和个人博客地址 成员 头像 岗位 博客 个人介绍 黄贤昊 PM 17373253 喜欢玩游戏和做游戏,项目经验基本都和游戏相关,擅长摸鱼,偶尔敬业. 吴桐雨 ...

  9. [对对子队]会议记录5.18(Scrum Meeting5)

    今天已完成的工作 何瑞 ​ 工作内容:搭建第8关 ​ 相关issue:搭建关卡7.8.9 ​ 相关签入:feat:初步搭建了Lv8 吴昭邦 ​ 工作内容:搭建第8关 ​ 相关issue:搭建关卡7.8 ...

  10. NorFlash、NandFlash在技术和应用上有些什么区别?

    首先你要搞懂什么是Flash Memory? Flash Memory(快闪存储器),是一种电子式可清除程序化只读存储器的形式,允许在操作中被多次擦或写的存储器.这种科技主要用于一般性数据存储,以及在 ...