題目鏈結
sbt,我居然沒看出來。
就是插入的時候考慮向平衡樹里插兩個差值,刪乙個差值。
另乙個操作就是維護某元素和其前驅後繼的差值最小值就行了。
然後splay超時了……
(貌似splay超時了之後我都是修改splay操作的頻率暴力硬卡,而不是考慮換一種思路……
然後就被我卡過了。
//luogu-judger-enable-o2
//luogu-judger-enable-o2
//luogu-judger-enable-o2
//luogu-judger-enable-o2
#include#include
#include
#include
#include
#define maxn 700010
using
namespace
std;
inline
long
long
read()
while
(isdigit(ch))
return num*f;
}int cnt=0
;struct
splaytree[maxn];
intpoint,tot,root;
splay()
inline
void update(int x)
inline
void connect(int x,int fa,int how)
inline
int iden(int x)
inline
void rotate(int
x)
void splay(int pos,int
to)
else}}
int create(int val,int
fa)
int build(int
val)
int now=root;
while(1
)
int nxt=tree[now].val>val?0:1
;
if(tree[now].e[nxt]==0
) now=tree[now].e[nxt];}}
void insert(int
val)
}int find(int
val)
return0;
}inline
void dele(int
x)
void pop(int
val)
if(tree[deal].e[0]==0
)
else
dele(deal);
}int rank(int
val)}}
inline
intarank()
return
tree[now].val;
}int lower(int
val)
if(tree[now].valans) ans=tree[now].val;
if(tree[now].val>val) now=tree[now].e[0
];
else now=tree[now].e[1
]; }
return
ans;
}int upper(int
val)
return
ans;
}}s,d;
intq[maxn];
intw[maxn];
int ans=700000000
;int
main()
for(register int i=1;i<=m;++i)
case'g
':printf("
%d\n
",s.arank()); break
;
case's
':printf("
%d\n
",ans); break
; }
}return0;
}
洛谷 1110 報表統計 線段樹
題解 考慮離散化,利用兩顆線段樹來維護合適的資訊求解兩個詢問。min gap 求相鄰的差值絕對值最小。建立線段樹儲存差值的出現次數,詢問時求差值最小的那個即可。記位置i ii初始值為a i a i a i 新插入的值為b i b i b i 初始b i a i b i a i b i a i 當在位...
洛谷P1110 報表統計 平衡樹 堆
在最開始的時候,有乙個長度為n n的整數序列,並且有以下三種操作 首先操作三是很簡單的,我們只要寫一棵平衡樹,維護每乙個數字的前驅後繼,每次插入乙個數就判斷它與它前驅後繼的差值是否小於min nmin n。如果小於就更新。對於第二問,定義las t i last i 表示原序列第i i個數字後面插入...
luogu1110 ZJOI2007 報表統計
這裡的初始化就不講了,看完操作講解就應該明白了,再不行就去看 對於操作1 由於操作2的需要,vector n 存下數 對於操作2的維護 查詢相鄰兩個元素的之間差值 絕對值 的最小值 先把所有答案存入乙個小頭堆裡 比如 a,c之間你要插入b 那麼,你就要刪除 c a 然後加入 a b c b 之後的堆...