洛谷.1110.[ZJOI2007]报表统计(Multiset Heap)
/*
对于询问1,用堆代替multiset/Splay
对于询问2,multiset
1.注意哨兵元素
2.注意multiset中删除时是删除某元素的一个位置,而不是这个元素!这个值会全部都删掉
*/
#include<set>
#include<cstdio>
#include<cctype>
#include<algorithm>
const int N=5e5+5,M=N*3,INF=1e9;
int n,q,st[N],ed[N],Min=INF;
std::multiset<int> A;
std::multiset<int>::iterator it;
struct Heap
{
int sz,A[M];
inline int Top()
{
return A[1];
}
void Push(int x)
{
A[++sz]=x;
int now=sz,nxt=now>>1;
while(now>1 && A[nxt]>A[now])
std::swap(A[nxt],A[now]), now=nxt, nxt=now>>1;
}
void Pop()
{
A[1]=A[sz--];
int now=1,nxt;
while(now<<1<=sz)
{
nxt=now<<1;
if(A[nxt]>A[nxt+1] && nxt<sz) ++nxt;
if(A[nxt]>=A[now]) break;
std::swap(A[now],A[nxt]);
now=nxt;
}
}
}h1,h2;
inline int read()
{
int now=0,f=1;register char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);now=now*10+c-'0',c=getchar());
return now*f;
}
void Ins(int v)
{
it=A.lower_bound(v);
Min=std::min(Min,*it-v);
Min=std::min(Min,v-(*--it));
A.insert(v);
}
void Modify()
{
int p=read(),v=read();
if(p!=n)
h2.Push(std::abs(st[p+1]-ed[p])),
h1.Push(std::abs(st[p+1]-v));
h1.Push(std::abs(ed[p]-v));
ed[p]=v;
if(Min) Ins(v);
}
inline int Query()
{
while(h1.Top()==h2.Top()) h1.Pop(),h2.Pop();
return h1.Top();
}
int main()
{
// freopen("form.in","r",stdin);
// freopen("form.out","w",stdout);
n=read(),q=read();
A.insert(-INF), A.insert(INF);
st[1]=ed[1]=read(),Ins(st[1]);
for(int i=2;i<=n;++i)
st[i]=ed[i]=read(),h1.Push(std::abs(st[i]-st[i-1])),Ins(st[i]);
char s[20];int p,v;
while(q--)
{
scanf("%s",s);
if(s[0]=='I') Modify();
else if(s[4]=='G') printf("%d\n",Query());
else printf("%d\n",Min);
}
return 0;
}
洛谷.1110.[ZJOI2007]报表统计(Multiset Heap)的更多相关文章
- 洛谷.1110.[ZJOI2007]报表统计(Splay Heap)
题目链接 附纯SplayTLE代码及主要思路: /* 可以看做序列有n段,Insert是每次在每一段最后插入一个元素 只有插入,没有删除,所以插入一个元素对于询问1影响的只有该元素与前边一个元素(同段 ...
- 洛谷.1110.[ZJOI2007]报表统计(Multiset)
题目链接 主要思路 /* 其实只需要multiset即可 对于询问1,删除.插入差值,输出最小元素 对于询问2,插入后用前驱后继更新 1.注意哨兵元素 2.注意multiset中删除时是删除某元素的一 ...
- BZOJ1058或洛谷1110 [ZJOI2007]报表统计
BZOJ原题链接 洛谷原题链接 STL 本题可以直接使用\(\mathtt{STL\ multiset}\)水过去. 因为本题插入数的操作实际上就是将原数列分为\(n\)段,在每一段的末尾插入数,所以 ...
- 洛谷 P1110 [ZJOI2007]报表统计 解题报告
P1110 [ZJOI2007]报表统计 题目描述 \(Q\)的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小\(Q\)希望可以帮妈妈分担一些工作,作为她的生日礼物之一. 经过仔细 ...
- 2018.11.09 洛谷P1110 [ZJOI2007]报表统计(multiset)
传送门 sb题. 直接用两个multisetmultisetmultiset维护相邻两个数的差值和所有数的前驱后继. 插入一个数的时候更新一下就行了. 代码: #include<bits/std ...
- BZOJ 1058: [ZJOI2007]报表统计 multiset + 卡常
Code: #include<bits/stdc++.h> #define maxn 600000 #define inf 1000000000 using namespace std; ...
- Luogu P1110 [ZJOI2007]报表统计 multiset
沿用了学长的$multiset$ 然后这道题可以看到我的程序中有两行注释,它在我看来和他们下面的代码没区别,但是我们发现,C++会先调用后面的参数,所以$--it$会被先执行 ... ... ... ...
- bzoj1058: [ZJOI2007]报表统计
set.操作:insert(u,v)在u后面插入v,若u后面已插入过,在插入过的后面插入.mingap求出序列两两之间差值的最小值.minsortgap求出排序后的序列两两之间的最小值.用multis ...
- BZOJ 1058: [ZJOI2007]报表统计( 链表 + set )
这种题用数据结构怎么写都能AC吧...按1~N弄个链表然后每次插入时就更新答案, 用set维护就可以了... --------------------------------------------- ...
随机推荐
- Python学习之not,and,or篇
Python学习之not,and,or篇 运算符示意 not –表示取反运算. and –表示取与运算. or –表示取或运算. 运算符优先级 not > and > or. 举例如下: ...
- HOG feature
- /etc/my.cnf
[client] default-character-set=utf8 [mysqld] tmp_table_size = 2048M max_heap_table_size = 2048M max_ ...
- Graphql 相关 strapi -- Koa2
Graphql 相关资源: https://github.com/chentsulin/awesome-graphql graphql-apis : https://gi ...
- nodejs 访问网站并操作xpath
var xpath = require('xpath'); //引用xpath包 var dom = require('xmldom-silent').DOMParser;//引用xmldom包 va ...
- DES加密模式详解
DES加密模式详解 http://www.cnblogs.com/Lawson/archive/2012/05/20/2510781.html http://www.blogjava.net/wayn ...
- WPF当中StaticResource调用方法
1.先在Converter命名空间当中,定义转换功能类: public sealed class BoolToValueConverter : System.Windows.Data.IValueCo ...
- nodejs服务器读取图片返回给前端(浏览器)显示
1 前言 项目需要用nodejs服务器给前端传递图片,网上找了好多资料,多数都是怎么在前端上传图片的,然后通过看runoob.com菜鸟教程,发现其实是非常简单,用express框架就行了. 2 代码 ...
- mybatis学习笔记--常见的错误
原文来自:<mybatis学习笔记--常见的错误> 昨天刚学了下mybatis,用的是3.2.2的版本,在使用过程中遇到了些小问题,现总结如下,会不断更新. 1.没有在configurat ...
- log4j2 使用详解
转载自 Blog of 天外的星星: http://www.cnblogs.com/leo-lsw/p/log4j2tutorial.html Log4j 2的好处就不和大家说了,如果你搜了2,说明你 ...