【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维护就可以了... --------------------------------------------- ...
随机推荐
- 【TensorFlow入门完全指南】模型篇·最近邻模型
最近邻模型,更为常见的是k-最近邻模型,是一种常见的机器学习模型,原理如下: KNN算法的前提是存在一个样本的数据集,每一个样本都有自己的标签,表明自己的类型.现在有一个新的未知的数据,需要判断它的类 ...
- URAL 2027 URCAPL, Episode 1 (模拟)
题意:给你一个HxW的矩阵,每个点是一个指令,根据指令进行一系列操作. 题解:模拟 #include<cstdio> #include<algorithm> using nam ...
- Java写诗程序
import java.util.Random; public class test_word { public static void main(String[] args) { System.ou ...
- 主成分分析法(PCA)答疑
问:为什么要去均值? 1.我认为归一化的表述并不太准确,按统计的一般说法,叫标准化.数据的标准化过程是减去均值并除以标准差.而归一化仅包含除以标准差的意思或者类似做法.2.做标准化的原因是:减去均值等 ...
- Windows上PostgreSQL安装配置教程
Windows上PostgreSQL安装配置教程 这篇文章主要为大家详细介绍了Windows上PostgreSQL安装配置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 PostgreSQL的 ...
- 【概率dp 高斯消元】bzoj3270: 博物馆
一类成环概率dp的操作模式 Description 有一天Petya和他的朋友Vasya在进行他们众多旅行中的一次旅行,他们决定去参观一座城堡博物馆.这座博物馆有着特别的样式.它包含由m条走廊连接的n ...
- [LUOGU] P4251 [SCOI2015]小凸玩矩阵
行列看成点,格子看成边,二分一个边权,删去大于它的边,新图上的最大流>k则答案可以更优,小于k则调整左边界. #include<algorithm> #include<iost ...
- 传智 Python基础班+就业班+课件 【最新完整无加密视频课程】
点击了解更多Python课程>>> 传智 Python基础班+就业班+课件 [最新完整无加密视频课程] 直接课程目录 python基础 linux操作系统基础) 1-Linux以及命 ...
- POJ:1753-Flip Game(二进制+bfs)
题目链接:http://poj.org/problem?id=1753 Flip Game Time Limit: 1000MS Memory Limit: 65536K Description Fl ...
- zoj 4056
At 0 second, the LED light is initially off. After BaoBao presses the button 2 times, the LED light ...