题意

数轴上有 \(n\) 个点,每一次你可以将所有位置在 \(x\) 的点移动到 \(x-1\) 或者是移动到 \(x+1\),花费为 \(1\)。

有 \(q\) 次操作,每一次会在数轴上添加一个原来没有的点或者是删除一个原来已经有的点。在所有操作前和每一次操作后你需要回答将所有点集中到不超过两个点的最小花费。

\(\texttt{Data Range:}1\leq n,q\leq 10^5\)

前言

你打开了本题。

你发现是已经写过了 \(998244353\) 遍的维护最大的邻项之差。

你熟练的写出了代码,但是发现需要分类讨论,很头疼。

你翻开了题解,发现题解也是分类讨论。

相信经历了这么多的你心中满满的“我太难了”。

那么这篇题解将拯救你于水火之中(?)

题解

注意到肯定是左边一段的点放在一起右边一段的点放在一起。

假设当前一共有 \(n\) 个点,从小到大依次为 \(p_1,\cdots,p_n\),考虑让 \(p_1,\cdots,p_k\) 放在一起,\(p_{k+1},\cdots,p_n\) 放在一起,那么花费为 \(p_k-p_1+p_n-p_{k+1}=(p_n-p_1)-(p_{k+1}-p_k)\)。

注意到对于每一个加点删点的操作来说 \(p_n-p_1\) 很容易维护,然后 \(p_{k+1}-p_k\) 就是开个 multiset 维护最大差值就完了。

但是这东西需要分类讨论很麻烦,所以我们想个办法让维护这东西变得很轻松不需要分类讨论。

考虑 Splay 预处理的时候往里面加 \(\infty\) 和 \(-\infty\),所以我们也可以往里面加 \(\infty\) 和 \(-\infty\)。

然后询问的时候最大的两个绝对是 \(p_1-(-\infty)\) 和 \(\infty-p_n\),于是只需要查询第三大的那个就好了,没有第三大的答案就是 \(0\)。

这么写可以规避各种各样的分类讨论,比如说什么新插入的值没有前驱后继啦,什么插入点之前 multiset 里元素不够啦什么的,何乐而不为呢?

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
const ll MAXN=2e5+51,inf=1e15;
multiset<ll>st,gap;
multiset<ll>::iterator it;
ll n,qcnt,op,u,prv,nxt,mx,mn;
ll x[MAXN];
inline ll read()
{
register ll num=0,neg=1;
register char ch=getchar();
while(!isdigit(ch)&&ch!='-')
{
ch=getchar();
}
if(ch=='-')
{
neg=-1;
ch=getchar();
}
while(isdigit(ch))
{
num=(num<<3)+(num<<1)+(ch-'0');
ch=getchar();
}
return num*neg;
}
inline void erase(ll x)
{
gap.erase(gap.find(x));
}
inline ll query()
{
if(*gap.begin()>=1e12)
{
return 0;
}
it=st.begin(),mn=*(++it),it=st.end(),--it,mx=*(--it);
return it=gap.end(),--it,--it,mx-mn-*(--it);
}
int main()
{
n=read(),qcnt=read(),st.insert(inf),st.insert(-inf);
for(register int i=1;i<=n;i++)
{
st.insert(x[i]=read());
}
sort(x+1,x+n+1),x[0]=-inf,x[n+1]=inf;
for(register int i=1;i<=n+1;i++)
{
gap.insert(x[i]-x[i-1]);
}
printf("%lld\n",query());
for(register int i=0;i<qcnt;i++)
{
op=read(),u=read();
if(op==0)
{
it=st.find(u),prv=u-*(--it),it++,nxt=*(++it)-u;
st.erase(u),erase(prv),erase(nxt),gap.insert(nxt+prv);
}
if(op==1)
{
it=st.upper_bound(u),nxt=*(it--),prv=*it,st.insert(u);
erase(nxt-prv),gap.insert(nxt-u),gap.insert(u-prv);
}
if(*gap.begin()>=1e12)
{
puts("0");
continue;
}
printf("%lld\n",query());
}
}

CodeForces 1418D Trash Problem的更多相关文章

  1. codeforces 340C Tourist Problem

    link:http://codeforces.com/problemset/problem/340/C 开始一点也没思路,赛后看别人写的代码那么短,可是不知道怎么推出来的啊! 后来明白了. 首先考虑第 ...

  2. codeforces B. Routine Problem 解题报告

    题目链接:http://codeforces.com/problemset/problem/337/B 看到这个题目,觉得特别有意思,因为有熟悉的图片(看过的一部电影).接着让我很意外的是,在纸上比划 ...

  3. Codeforces 527D Clique Problem

    http://codeforces.com/problemset/problem/527/D 题意:给出一些点的xi和wi,当|xi−xj|≥wi+wj的时候,两点间存在一条边,找出一个最大的集合,集 ...

  4. Codeforces 706C - Hard problem - [DP]

    题目链接:https://codeforces.com/problemset/problem/706/C 题意: 给出 $n$ 个字符串,对于第 $i$ 个字符串,你可以选择花费 $c_i$ 来将它整 ...

  5. Codeforces 1096D - Easy Problem - [DP]

    题目链接:http://codeforces.com/problemset/problem/1096/D 题意: 给出一个小写字母组成的字符串,如果该字符串的某个子序列为 $hard$,就代表这个字符 ...

  6. Codeforces 793C - Mice problem(几何)

    题目链接:http://codeforces.com/problemset/problem/793/C 题目大意:给你一个捕鼠器坐标,和各个老鼠的的坐标以及相应坐标的移动速度,问你是否存在一个时间点可 ...

  7. CodeForces 687A NP-Hard Problem

    Portal:http://codeforces.com/problemset/problem/687/A 二分图染色 好模板题 有SPJ 值得注意的是,因为C++的奇妙的运算机制 若在vector变 ...

  8. Codeforces Gym 100342J Problem J. Triatrip 求三元环的数量 bitset

    Problem J. Triatrip Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100342/at ...

  9. Codeforces Gym 100342C Problem C. Painting Cottages 转化题意

    Problem C. Painting CottagesTime Limit: 2 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/10 ...

随机推荐

  1. Apollo系列(二):Apollo在ASP.NET Core 3.1中使用

    关于Apollo怎么安装,我就不介绍,可以看这篇文章:https://www.cnblogs.com/vic-tory/p/13736192.html 一.Apollo使用: 1.创建项目 2.添加配 ...

  2. Mysql探索之Explain执行计划详解

    前言 如何写出效率高的SQL语句,提到这必然离不开Explain执行计划的分析,至于什么是执行计划,如何写出高效率的SQL,本篇文章将会一一介绍. 执行计划 执行计划是数据库根据 SQL 语句和相关表 ...

  3. 微信小程序结合微信公众号进行消息发送

    微信小程序结合微信公众号进行消息发送 由于小程序的模板消息已经废弃了,官方让使用订阅消息功能.而订阅消息的使用限制比较大,用户必须得订阅.需要获取用户同意接收消息的权限.用户必须得和小程序有交互的时候 ...

  4. POI和easyExcel

    POI与easyExcel 这个东西一般用来做什么? 将用户信息导出为Excel表格(导出数据) 将Excel表中的信息录入到网站数据库(比如一些习题上传) 在开发过程中会遇到对Excel的处理,比如 ...

  5. 秋天的第一份“干货” I Referer 防盗链,为什么少了个字母 R?

    Referer 为什么叫 Referer?它代表什么意思?在诸多防盗链竞争中它有什么优势? 今天,在聊 Referer 防盗链之前,先来聊聊我们在现实生活中常常碰到的推荐人(Referrer)信息. ...

  6. spring-boot-route(一)Controller接收参数的几种方式

    Controller接收参数的常用方式总体可以分为三类.第一类是Get请求通过拼接url进行传递,第二类是Post请求通过请求体进行传递,第三类是通过请求头部进行参数传递. 1 @PathVariab ...

  7. 服务器备用远程-----Radmin客户端的操作指南(如何远程与传送文件)

    一台服务器的寿命一般比较长可能会从几年到几十年,就会经历各个版本的更新与升级.再经过时间的历练后,可能windwos自带的远程连接有时候会拉胯,经常报错. 这时候就需要备选方案,有钱的单位会自己搭建堡 ...

  8. 002 01 Android 零基础入门 01 Java基础语法 01 Java初识 02 Java简介

    002 01 Android 零基础入门 01 Java基础语法 01 Java初识 02 Java简介 学习Java的基础语法 Java是一门编程语言,学习的逻辑其实和现实世界的语言是一样的,需要了 ...

  9. ATMEGA的SPI总线 - 第1部分

    转自: 1. https://www.yiboard.com/thread-782-1-1.html 2.https://mansfield-devine.com/speculatrix/2018/0 ...

  10. Linux 安装Navicat Premium 15

    参考:https://gitee.com/andisolo/navicat-keygen 安装 aptitude 管理软件 $ sudo apt-get install aptitude 安装Navi ...