【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维护就可以了... --------------------------------------------- ...
随机推荐
- mininet安装,使用
http://mininet.org/download/ http://sdnhub.cn/index.php/mininet-walkthrough-chinese/ --------------- ...
- CF Gym 100187J Deck Shuffling (dfs判连通)
题意:给你一堆牌,和一些洗牌机,可以改变牌的顺序,问你能不能通过洗牌机把数字为x的牌洗到第一个位置. 题解:反向建边,dfs判断连通性 #include<cstdio> #include& ...
- Hybrid App开发之Html基本标签使用
前言: 前面简单学习了html简单标签的使用,今天学习一下其他的标签的使用. HTML的超链接 1.)创建一个超链接 <div> <p> <a href="ht ...
- 10分钟搞懂toString和valueOf函数(详细版)
首先要说明的是这两种方法是toPrimitive抽象操作里会经常用到的. 默认情况下,执行这个抽象操作时会先执行valueOf方法,如果返回的不是原始值,会继续执行toString方法,如果返回的还不 ...
- 关于Java虚拟机JVM的简单了解
JVM主要功能 Java是一种高级编程语言. 用高级语言编写的程序不能直接在任何机器上运行. 首先,需要将其翻译成特定的机器语言,javac编译器就专门来干这个事儿的,它把Java程序(含有的.jav ...
- C# 数据结构 - 单链表 双链表 环形链表
链表特点(单链表 双链表) 优点:插入和删除非常快.因为单链表只需要修改Next指向的节点,双链表只需要指向Next和Prev的节点就可以完成插入和删除操作. 缺点:当需要查找某一个节点的时候就需要一 ...
- @private@protected@public@package
@private@protected@public@package 为了强制一个对象隐藏其数据,编译器限制实例变量范围以限制其在程序中的可见性 但是为了提供灵活性,苹果也让开发者显式设置范围(四选一) ...
- iOS下的2D仿射变换机制(CGAffineTransform相关)
仿射变换简介 仿射变换源于CoreGraphics框架,主要作用是绘制2D级别的图层,几乎所有iOS设备屏幕上的界面元素都是由CoreGraphics来负责绘制.而我们要了解的2D仿射变换是其下负责二 ...
- dev gridview columns代码管理
进入run designer界面.我们将在代码中设置columns的属性. 类: ViewTriAtt : DevExpress.XtraEditors.XtraUserControl 在类里面设置g ...
- char与varchar的区别与联系
char是字节类型,varcahr是字符类型 1.char(20) 存放的是字节,utf-8中文字符占三个字节,GB18030兼容GBK兼容GB2312中文字符占两个字节,ISO8859-1是拉丁字符 ...