伸展樹 入門

2021-07-06 02:47:17 字數 3357 閱讀 7227

參考部落格

部落格鏈結

網上資料不少,留下自己ac**方便以後回看,用的spt模板是部落格裡的題目鏈結

題意:

求最小的營業額波動總和

最小的營業額波動=min(|x-y|),y是之前某天營業額

解法:

插入某個數,找前序以及後序即可

**:

#include 

#include

#include

#include

#include

#include

#include

#include

#define rep(i,n) for(i=0;i#define cle(x) memset(x,0,sizeof(x))

#define ll long long

#define keytree (ch[ ch[root][1] ][0])

const

int maxn=100000+5;

using

namespace

std;

struct splaytree

inline

void splay(int x,int goal) else else }}

if(goal == 0) root = x;

}inline

void newnode(int &x,int c)

inline

void insert(int k)

while(ch[r][val[r]0);

}inline

int getpre(int r)

inline

int getflo(int r)

inline

void work(int n)

if(right)

ans+=(ll)temp;}}

printf("%i64d\n",ans);

}int val[maxn];

}spt;

int main()

return

0;}

題目鏈結

題意:

1:新增優先順序為p的k號機器

2:去掉佇列裡優先順序最高的機器

3:去掉佇列裡優先順序最低的機器

解法:

2:min=while(ch[root][0]),splay(min,0),並刪掉即可

3: 類似,伸展後無右子樹

**:

#include 

#include

#include

#include

#include

#include

#include

#include

#define rep(i,n) for(i=0;i#define cle(x) memset(x,0,sizeof(x))

#define ll long long

const

int maxn=1000000+5;

using

namespace

std;

#define keytree (ch[ ch[root][1] ][0])

struct splaytree

inline

void splay(int x,int goal) else else }}

if(goal == 0) root = x;

}inline

void newnode(int &x,int c,int p)

inline

void insert(int k,int p)

while(ch[r][val[r]0);

}inline

int getmin(int r)

inline

int getmax(int r)

inline

void work()

else

if(op==3)

else

if(op==2)

else

// debug();}}

int val[maxn];

int ip[maxn];

}spt;

int main()

最後獻上 poj 3468段更新 by notonlysuccess

#include 

#include

#include

#include

#include

#include

#include

#include

#define rep(i,n) for(i=0;i#define cle(x) memset(x,0,sizeof(x))

#define ll long long

#define keytree (ch[ ch[root][1] ][0])

const

int maxn=200000+5;

using

namespace

std;

struct splaytree

inline

void splay(int x,int goal) else else }}

push_up(x);

if(goal == 0) root = x;

}inline

void rotateto(int k,int goal) else

push_down(x);

}splay(x,goal);

}inline

void newnode(int &x,int c)

inline

void push_down(int x)

}inline

void push_up(int x)

inline

void maketree(int &x,int l,int r,int f)

inline

void init(int n)

inline

void update()

inline

void query()

int num[maxn];

int val[maxn];

int add[maxn];

ll sum[maxn];

}spt;

int main()

return

0;}

伸展樹模板

include include include include define key value ch ch root 1 0 using namespace std const int maxn 200000 10 char op maxn 10 int opx maxn int s maxn e...

伸展樹模板

給定乙個數n,代表有乙個數列1 n,有下面兩種操作 cut a b c 把區間 a,b 這一段元素切下來接到新序列第c個元素的後面 flip a b 反轉區間 a,b 最後遍歷整個序列 define key val son son root 1 0 typedef long long ll cons...

總結 伸展樹Splay

感覺我在聯賽還差4天的時候學習splay有點慌,但還是要學一下。我們先對splay的陣列進行一些定義 struct nodet n 2 我們的splay應該要支援以下幾個操作 如下 includeusing namespace std const int n 500010 int root,tot ...