Luogu P1110報表統計(Splay)

2022-05-01 01:18:13 字數 2225 閱讀 4280

題目鏈結

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 之後的堆...