【Luogu】P1110报表统计(Splay)
SBT,我居然没看出来。
就是插入的时候考虑向平衡树里插两个差值,删一个差值。
另一个操作就是维护某元素和其前驱后继的差值最小值就行了。
然后Splay超时了……
(貌似Splay超时了之后我都是修改splay操作的频率暴力硬卡,而不是考虑换一种思路……
然后就被我卡过了。
// luogu-judger-enable-o2
// luogu-judger-enable-o2
// luogu-judger-enable-o2
// luogu-judger-enable-o2
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
#include<cstdlib>
#define maxn 700010
using namespace std;
inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} int CNT=;
struct Splay{
struct Node{
int val,fa,e[],size,sum;
}tree[maxn];
int point,tot,root;
Splay(){point=tot=root=; }
inline void update(int x){ tree[x].size=tree[tree[x].e[]].size+tree[tree[x].e[]].size+tree[x].sum; }
inline void connect(int x,int fa,int how){ tree[x].fa=fa; tree[fa].e[how]=x; }
inline int iden(int x){ return x==tree[tree[x].fa].e[]; }
inline void rotate(int x){
int y=tree[x].fa;int r=tree[y].fa;
if(y==root) root=x;
int sony=iden(x);int sonr=iden(y);
int b=tree[x].e[sony^];
connect(b,y,sony);
connect(y,x,sony^);
connect(x,r,sonr);
update(y); update(x);
}
void splay(int pos,int to){
to=tree[to].fa;
while(tree[pos].fa!=to){
if(tree[tree[pos].fa].fa==to) rotate(pos);
else
if(iden(pos)==iden(tree[pos].fa)){
rotate(tree[pos].fa);
rotate(pos);
}
else{ rotate(pos); rotate(pos); }
}
}
int create(int val,int fa){
tree[++tot].val=val; tree[tot].fa=fa;
tree[tot].size=tree[tot].sum=;
return tot;
}
int build(int val){
point++;
if(root==){ root=create(val,); return root; }
int now=root;
while(){
tree[now].size++;
if(tree[now].val==val){ tree[now].sum++; return now; }
int nxt=tree[now].val>val?:;
if(tree[now].e[nxt]==){
connect(create(val,now),now,nxt);
update(now);
return tot;
}
now=tree[now].e[nxt];
}
}
void insert(int val){
int p=build(val);
if(++CNT=){
CNT=;
splay(p,root);
}
}
int find(int val){
int now=root;
while(now){
if(tree[now].val==val) return now;
int nxt=val<tree[now].val?:;
now=tree[now].e[nxt];
}
return ;
}
inline void dele(int x){
tree[x].e[]=tree[x].e[]=tree[x].fa=;
if(x==tot) tot--;
}
void pop(int val){
int deal=find(val);
if(deal==) return;
splay(deal,root);
if(tree[deal].sum>){
tree[deal].size--; tree[deal].sum--;
return;
}
if(tree[deal].e[]==){
root=tree[deal].e[];
tree[root].fa=;
}
else{
int le=tree[deal].e[];
while(tree[le].e[]) le=tree[le].e[];
splay(le,tree[deal].e[]);
connect(tree[deal].e[],le,); connect(le,,);
update(le);
root=le;
}
dele(deal);
}
int rank(int val){
int now=root,ans=;
while(now){
if(tree[now].val==val) return ans+tree[tree[now].e[]].size+;
int nxt=val<tree[now].val?:;
if(nxt==) now=tree[now].e[];
else{
ans+=tree[tree[now].e[]].size+tree[now].sum;
now=tree[now].e[];
}
}
}
inline int arank(){
int now=root;
while(tree[now].e[]) now=tree[now].e[];
if(++CNT==){
splay(now,root);
CNT=;
}
return tree[now].val;
}
int lower(int val){
int ans=-,now=root;
while(now){
if(tree[now].val==val){
splay(now,root);
return val;
}
if(tree[now].val<val&&tree[now].val>ans) ans=tree[now].val;
if(tree[now].val>val) now=tree[now].e[];
else now=tree[now].e[];
}
return ans;
}
int upper(int val){
int ans=,now=root;
while(now){
if(tree[now].val==val) return val;
if(tree[now].val>val&&tree[now].val<ans) ans=tree[now].val;
if(tree[now].val<val) now=tree[now].e[];
else now=tree[now].e[];
}
return ans;
}
}s,d; int q[maxn];
int w[maxn];
int ans=;
int main(){
int n=read(),m=read();
for(int i=;i<=n;++i){
q[i]=w[i]=read();
if(i!=) s.insert(abs(q[i]-q[i-]));
int now=min(abs(d.lower(q[i])-q[i]),abs(d.upper(q[i])-q[i]));
d.insert(q[i]);
if(now<ans) ans=now;
}
for(register int i=;i<=m;++i){
char ch[];
scanf("%s",ch);
switch(ch[]){
case 'R':{
int a=read(),b=read();
s.pop(abs(w[a]-q[a+]));
s.insert(abs(w[a]-b));
s.insert(abs(b-q[a+]));
w[a]=b;
int now=min(abs(d.lower(b)-b),abs(d.upper(b)-b));
if(now<ans) ans=now;
d.insert(b);
break;
}
case 'G':printf("%d\n",s.arank()); break;
case 'S':printf("%d\n",ans); break;
}
}
return ;
}
【Luogu】P1110报表统计(Splay)的更多相关文章
- BZOJ1058:[ZJOI2007]报表统计(Splay,堆)
Description 小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工 作,作为她的生日礼物之一.经过仔细观察,小Q发现统计一张报表实际上是维护一个 ...
- 洛谷.1110.[ZJOI2007]报表统计(Splay Heap)
题目链接 附纯SplayTLE代码及主要思路: /* 可以看做序列有n段,Insert是每次在每一段最后插入一个元素 只有插入,没有删除,所以插入一个元素对于询问1影响的只有该元素与前边一个元素(同段 ...
- p1110 报表统计(FHQ-TREAP/TREAP)
平衡树的裸题,操作都相当简单 写了一个FHQ,但是奈何常数太大,实在过不去 最后写了一个Treap开O2水过 TREAP代码 #include <cstdio> #include < ...
- 洛谷 P1110 [ZJOI2007]报表统计 解题报告
P1110 [ZJOI2007]报表统计 题目描述 \(Q\)的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小\(Q\)希望可以帮妈妈分担一些工作,作为她的生日礼物之一. 经过仔细 ...
- [ZJOI2007]报表统计(splay,堆)
[ZJOI2007]报表统计(luogu) Description 题目描述 Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工作,作为她的生日礼物之一. ...
- 【BZOJ1058】【ZJOI2007】报表统计(链表,堆,Splay)
[BZOJ1058][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]报表统计
set.操作:insert(u,v)在u后面插入v,若u后面已插入过,在插入过的后面插入.mingap求出序列两两之间差值的最小值.minsortgap求出排序后的序列两两之间的最小值.用multis ...
- BZOJ 1058: [ZJOI2007]报表统计( 链表 + set )
这种题用数据结构怎么写都能AC吧...按1~N弄个链表然后每次插入时就更新答案, 用set维护就可以了... --------------------------------------------- ...
随机推荐
- 浅谈iOS学习之路
转眼学习iOS已经快两年的时间了,这个路上有挫折也有喜悦,一步步走过来发现这个过程是我这一辈子的财富,我以前的老大总是对我说,年轻就是最大的资本(本人91年),现在才算是慢慢的体会到,反观自己走过的这 ...
- 为Oracle Clusterware修改公用及私有网络接口
出于种种原因我们可能需要为已安装的Oracle集群软件修改其使用的公用或私有网络所使用的网络接口(How to Change Interconnect/Public Interface IP or S ...
- [论文理解]SSD:Single Shot MultiBox Detector
SSD:Single Shot MultiBox Detector Intro SSD是一套one-stage算法实现目标检测的框架,速度很快,在当时速度超过了yolo,精度也可以达到two-stag ...
- 深入理解ES6箭头函数的this以及各类this面试题总结
ES6中新增了箭头函数这种语法,箭头函数以其简洁性和方便获取this的特性,俘获了大批粉丝儿 它也可能是面试中的宠儿, 我们关键要搞清楚 箭头函数和普通函数中的this 一针见血式总结: 普通函数中的 ...
- c++ 指针数组,输入4个季度的花费,计算出总花费
#include <iostream> #include <array> #include <string> const int Seasons = 4; cons ...
- matplotlib绘图(三)
matplotlib中2D图形的绘制 直方图 直方图的参数只有一个x,不像条形图需要传入x,y 直方图作用:是统计x在某个区间上出现的次数 直方图是条形图的一种形式 hist()的参数: #bins ...
- Linux - NodeJS安装
1> 去NodeJS官网 https://nodejs.org/en/ 或 中文网 http://nodejs.cn/download/ 拷贝相应版本的安装文件,如下图: 2> 执行 wg ...
- 基于idea创建Tomcat远程调试
编辑完catalina文件后重启tomcat
- vsftpd服务安装与虚拟用户配置
vsftpd的全名是“Very secure FTP Daemon” 一.安装vsftpd安装db4-util用于生成认证文件 yum -y install db4-utils 安装vsftpd yu ...
- 浅探webpack优化
由于前端的快速发展,相关工具的发展速度也是相当迅猛,各大框架例如vue,react都有自己优秀的脚手架工具来帮助我们快速启动一个新项目,也正式因为这个原因,我们对于脚手架中最关键的一环webpack相 ...