题意

数轴上有 \(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. JavaScript创建对象的方式汇总

    1.Object构造函数创建 // 1.Object构造函数创建 var Obj = new Object(); Obj.name='saoge'; Obj.say=function(){ conso ...

  2. 决策树防止过拟合(预剪枝(Pre-Pruning))

    预剪枝(Pre-Pruning):预剪枝就是在构造决策树的过程中,先对每个结点在划分前进行估计,若果当前结点的划分不能带来决策树模型泛华性能的提升,则不对当前结点进行划分并且将当前结点标记为叶结点.

  3. Java学习day04

    day04-课堂笔记 1.运算符[剩下的运算符] * 赋值运算符 两种类型: 基本赋值运算符:= 扩展的赋值运算符: += -= *= /= %= 它们都是先执行等号右边的表达式,最后再经过运算赋值给 ...

  4. 玩转Libmodbus(一) 搭建开发环境

    这篇文章是转载的,我主要是参考了其搭建环境的部分. 转载自: https://blog.csdn.net/qq_40452910/article/details/88560310 一.源码下载 1.l ...

  5. QT博客:QT学习之路

    http://www.qter.org/thread-629-1-1.html

  6. pytorch和tensorflow的爱恨情仇之张量

    pytorch和tensorflow的爱恨情仇之基本数据类型:https://www.cnblogs.com/xiximayou/p/13759451.html pytorch版本:1.6.0 ten ...

  7. <stdbool.h>的使用

    转载: 1.https://www.cnblogs.com/jediael/archive/2013/02/03/4304259.html 2.https://zhidao.baidu.com/que ...

  8. matlab中drawnow更新图窗并处理回调

    来源:https://ww2.mathworks.cn/help/matlab/ref/drawnow.html?searchHighlight=drawnow&s_tid=doc_srcht ...

  9. 远程触发Jenkins的Pipeline任务的并发问题处理

    前文概述 本文是<远程触发Jenkins的pipeline任务>的续篇,上一篇文章实战了如何通过Http请求远程触发指定的Jenkins任务,并且将参数传递给Jenkins任务去使用,文末 ...

  10. TP5发送邮件

    1,前提去qq邮箱开启smtp 2,生成授权码 2,发送短信给 3,附上代码 贴上代码如下 <?phpnamespace app\mails\controller;use \think\Cont ...