luogu1110[ZJOI2007]报表统计
思路
这里的初始化就不讲了,看完操作讲解就应该明白了,再不行就去看代码
对于操作1
由于操作2的需要,vector[n]存下数
对于操作2的维护
查询相邻两个元素的之间差值(绝对值)的最小值
先把所有答案存入一个小头堆里
比如 a,c之间你要插入b
那么,你就要删除|c-a|,然后加入|a-b|,|c-b|
之后的堆顶就是ans啦
对于支持删除的小头堆,我只会fhqtreap代替
但我也不想写, 因为太麻烦了
那么,我们能不能用STL自带的priority_queue
当然是可行的
维护两个堆,x,y
ans存入x中,需要删除的存入y中
每次更改的时候,改存的放入x,改删的放入y
每当x.top()==y.top(),就一起删掉,(注意!y.empty())
对于操作3的维护
查询所有元素中最接近的两个元素的差值(绝对值)
每次修改一个数,对最优答案都不会有坏的影响(显然)
那好的影响是啥
就是他和她的前驱,后继的差(显然)
注意前驱,后继的存在性
错误及其优化
最近老是不动脑子了(或者根本没脑子?)
insert操作查找前驱后继的时候可以省去find操作
代码
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#define FOR(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
const int maxn=5e5+7;
const int inf=0x3f3f3f3f;
inline int read() {
int x=0,f=1;char s=getchar();
for(; s>'9'||s<'0'; s=getchar()) if(s=='-') f=-1;
for(; s>='0'&&s<='9'; s=getchar()) x=x*10+s-'0';
return x*f;
}
int n,m,rt,ans2=inf,a[maxn],cnt;
struct node {
int ch[2],val,fa,siz;
} e[maxn*2];
vector<int> x[maxn];
priority_queue<int, vector<int>, greater<int> > ans1,delet;
inline int abs(int a) {return a>0?a:-a;}
inline void pushup(int x) {e[x].siz=e[e[x].ch[0]].siz+e[e[x].ch[1]].siz+1;}
inline void rotate(int x) {
int y=e[x].fa,z=e[y].fa,k=e[y].ch[1]==x;
e[x].fa=z;
e[z].ch[e[z].ch[1]==y]=x;
e[y].ch[k]=e[x].ch[k^1];
e[e[x].ch[k^1]].fa=y;
e[y].fa=x;
e[x].ch[k^1]=y;
pushup(x);pushup(y);
}
void splay(int x,int goal) {
while(e[x].fa!=goal) {
int y=e[x].fa,z=e[y].fa;
if(z!=goal)(e[y].ch[1]==x)^(e[z].ch[1]==y) ? rotate(y):rotate(x);
rotate(x);
}
if(!goal) rt=x;
}
void find(int a) {
int now=rt;
while(e[now].ch[e[now].val<a]&&e[now].val!=a)
now=e[now].ch[e[now].val<a];
splay(now,0);
}
void insert(int x) {
int now=rt,fa=0;
while(now&&e[now].val!=x)
fa=now,now=e[now].ch[e[now].val<x];
now=++cnt;
if(fa) e[fa].ch[e[fa].val<x]=now;
e[now].val=x;
e[now].fa=fa;
e[now].siz=1;
splay(now,0);
}
inline int qq(int x) {
if(e[rt].val<x) return rt;
int now=e[rt].ch[0];
while(e[now].ch[1]) now=e[now].ch[1];
return now;
}
inline int hj(int x) {
if(e[rt].val>x) return rt;
int now=e[rt].ch[1];
while(e[now].ch[0]) now=e[now].ch[0];
return now;
}
int build(int l,int r,int fa) {
if(l>r) return 0;
int mid=(l+r)>>1,p=++cnt;
e[p].val=a[mid];
e[p].fa=fa;
e[p].siz=1;
e[p].ch[0]=build(l,mid-1,p);
e[p].ch[1]=build(mid+1,r,p);
pushup(p);
return p;
}
int main() {
n=read(),m=read();
FOR(i,1,n) a[i]=read(),x[i].push_back(a[i]);
//ans1
FOR(i,2,n) ans1.push(abs(x[i][0]-x[i-1][0]));
//ans2
sort(a+1,a+1+n);
FOR(i,2,n) ans2=min(abs(a[i]-a[i-1]),ans2);
a[0]=-inf,a[n+1]=inf;
rt=build(0,n+1,0);
char s[10];
FOR(i,1,m) {
scanf("%s",s);
if(s[4]=='R') {
int a=read(),b=read();
//ans1
if(a!=n) delet.push(abs(x[a][x[a].size()-1]-x[a+1][0]));
x[a].push_back(b);
if(a!=n) ans1.push(abs(x[a][x[a].size()-1]-x[a+1][0]));
ans1.push(abs(x[a][x[a].size()-1]-x[a][x[a].size()-2]));
while(delet.size()&&ans1.top()==delet.top()) ans1.pop(),delet.pop();
//ans2
find(b);
if(e[rt].val==b) {ans2=0;continue;}
insert(b);
int x=e[qq(b)].val,y=e[hj(b)].val;
ans2=min(ans2,min(abs(x-b),abs(y-b)));
} else if(s[4]=='G') {
cout<<ans1.top()<<"\n";
} else if(s[4]=='S') {
cout<<ans2<<"\n";
}
}
return 0;
}
luogu1110[ZJOI2007]报表统计的更多相关文章
- [luogu1110][ZJOI2007]报表统计【平衡树】
传送门 [洛谷传送门] [bzoj传送门] 前言 洛谷和网上的题解都好复杂哦,或者是stl水过. 窝的语文不怎么好,所以会有一些表达上的累赘或者是含糊不清,望各大佬海涵. 前置芝士 首先你一定要会平衡 ...
- bzoj1058: [ZJOI2007]报表统计
set.操作:insert(u,v)在u后面插入v,若u后面已插入过,在插入过的后面插入.mingap求出序列两两之间差值的最小值.minsortgap求出排序后的序列两两之间的最小值.用multis ...
- BZOJ 1058: [ZJOI2007]报表统计( 链表 + set )
这种题用数据结构怎么写都能AC吧...按1~N弄个链表然后每次插入时就更新答案, 用set维护就可以了... --------------------------------------------- ...
- [补档][ZJOI2007] 报表统计
[ZJOI2007] 报表统计 题目 传送门 小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工作,作为她的生日礼物之一. 经过仔细观察,小Q发现统计一 ...
- BZOJ_1058_[ZJOI2007]报表统计_STL
BZOJ_1058_[ZJOI2007]报表统计_STL Description 小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工 作,作为她的生日礼 ...
- bzoj 1058: [ZJOI2007]报表统计 (Treap)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1058 题面; 1058: [ZJOI2007]报表统计 Time Limit: 15 Sec ...
- 洛谷 P1110 [ZJOI2007]报表统计 解题报告
P1110 [ZJOI2007]报表统计 题目描述 \(Q\)的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小\(Q\)希望可以帮妈妈分担一些工作,作为她的生日礼物之一. 经过仔细 ...
- bzoj P1058 [ZJOI2007]报表统计——solution
1058: [ZJOI2007]报表统计 Time Limit: 15 Sec Memory Limit: 162 MB Submit: 4099 Solved: 1390 [Submit][St ...
- 【BZOJ1058】[ZJOI2007]报表统计 STL
[BZOJ1058][ZJOI2007]报表统计 Description 小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工作,作为她的生日礼物之一.经 ...
随机推荐
- 常见web错误码
404表示文件或资源未找到 java WEB常见的错误代码 .1xx-信息提示:这些状态代码表示临时的响应.客户端在收到常规响应之前,应准备接收一个或多个1xx响应. -继续. -切换协议. .2xx ...
- Oracle TNS-01190: The user is not authorized to execute the requested listener command
今天,在玩 lsnrctl命令,是为了了解Oracle的一些配置. 当执行 show inbound_connect_timeout 命令之后,提示了错误信息: TNS-01190: The user ...
- java 中多线程和锁的使用以及获取多线程执行结果
多线程一:原生的写法 关键词 implements 实现 Runnable 类 run() 方法 注意点 : 创建类的实例 InterfaceController inter=new Int ...
- UVa437 The Tower of Babylon(巴比伦塔)
题目 有n(n<=30)种立方体,每种有无穷多个,摞成尽量高的柱子,要求上面的立方体要严格小于下面的立方体. 原题链接 分析 顶面的大小会影响后续的决策,但不能直接用d[a][b]来表示,因为可 ...
- mysql 知识
1. 数据库事务的四个特性及含义 数据库事务transanction正确执行的四个基本要素.ACID,原子性(Atomicity).一致性(Correspondence).隔离性(Isolation ...
- SiteCore Experience Analytics-体验分析
体验分析 Sitecore Experience Analytics为营销人员和营销分析师提供仪表板和报告,以识别从其网站和可能的其他外部数据源收集的体验数据的模式和趋势. 体验分析报告示例: ...
- sitecore系统教程之架构概述
Sitecore体验数据库(xDB)从实时大数据存储库中的所有通道源收集所有客户交互.它连接交互数据,为每个客户创建全面,统一的视图,并使营销人员可以使用数据来管理客户的实时体验. xDB架构非常灵活 ...
- python 正则re.search
re.search 扫描整个字符串并返回第一个成功的匹配. 上码: import re line = "Cats are smarter than dogs"; searchObj ...
- Python Selenium element is not reachable by keyboard
碰到这个问题,没法解决, 最后这么搞的 pcAction.move_by_offset(571, 534).click().perform() #激活输入框 driver.switch_to.acti ...
- Python基本数据类型——列表
序列 序列是Python中的内置数据结构,常见的序列有:列表.字典.元组. 所有的序列都有自己的索引,程序可以通过索引来访问对应的值. 列表 list list是Python的一种最常见的内置数据类型 ...