题意

数轴上有 \(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. Spring ioc 源码分析之--beanFactory.registerResolvableDependency()方法

    背景: 在spring ioc refresh()方法中,看到了如下逻辑: 要理解该逻辑的原理,先看场景:有个接口InterFaceA,它有2个实现类A1和A2 那么,如果一个类C 依赖了InterF ...

  2. GAN训练技巧汇总

    GAN自推出以来就以训练困难著称,因为它的训练过程并不是寻找损失函数的最小值,而是寻找生成器和判别器之间的纳什均衡.前者可以直接通过梯度下降来完成,而后者除此之外,还需要其它的训练技巧. 下面对历年关 ...

  3. 030 01 Android 零基础入门 01 Java基础语法 03 Java运算符 10 条件运算符

    030 01 Android 零基础入门 01 Java基础语法 03 Java运算符 10 条件运算符 本文知识点:Java中的条件运算符 条件运算符是Java当中唯一一个三目运算符 什么是三目运算 ...

  4. VID和PID

    今天很在一份datasheet上突然看到 VID 和 PID 很奇怪!!还不是很懂!!! 参考:https://blog.csdn.net/gaojinshan/article/details/787 ...

  5. 【学习笔记/题解】虚树/[SDOI2011]消耗战

    题目戳我 \(\text{Solution:}\) 题目很显然可以设\(dp[i]\)表示\(i\)的子树内的关键点都不和\(i\)联通的最小待机,有如下\(dp\)方程: \(v\in son_u, ...

  6. GAN网络之入门教程(四)之基于DCGAN动漫头像生成

    目录 使用前准备 数据集 定义参数 构建网络 构建G网络 构建D网络 构建GAN网络 关于GAN的小trick 训练 总结 参考 这一篇博客以代码为主,主要是来介绍如果使用keras构建一个DCGAN ...

  7. Go语言中的常见的几个坑

    目录 1.for range 2.defer与闭包 3.map内存溢出 4.协程泄漏 5.http手动关闭 记录一下日常中遇到的几个坑,加深一下印象. 1.for range 这个是比较常见的问题了, ...

  8. 天啦噜!知道硬盘很慢,但没想到比 CPU L1 Cache 慢 10000000 倍

    前言 大家如果想自己组装电脑的话,肯定需要购买一个 CPU,但是存储器方面的设备,分类比较多,那我们肯定不能只买一种存储器,比如你除了要买内存,还要买硬盘,而针对硬盘我们还可以选择是固态硬盘还是机械硬 ...

  9. Python--网络爬虫模块requests模块之响应--response

    当requests发送请求成功后,requests就会得到返回值,如果服务器响应正常,就会接收到响应数据: Response响应中的属性和方法 常用属性: status_code: 数据类型:int ...

  10. day55 Pyhton 前端Jquery07

    昨日回顾: 表单,点击submit提交以后,服务端受到信息 import socket import pymysql from urllib.parse import unquote def run( ...