splay區間操作

2021-06-19 06:12:28 字數 2243 閱讀 2182

splaytree

區間操作

-----------

區間修改

題目:題目大意:給出一組數字,區間整體增加乙個值,區間查詢和

思路:很經典的區間操作的題目,因此思路也不用自己想,

都是各路以例題的形式給出

之前用線段數寫的,用了

1938ms

,今天用

splay

寫,耗時

2875.

說一下splay

操作的幾個要點:(其實核心還是程式設計珠璣的主題

---抓住問題的本質) 1

:操作的區間包括1或

n的時候怎麼辦,如果操作的是

[a,b],

我們要進行

splay(a-1, nul),

splay(b + 1, root)

,這個時候就要考慮

a-1和

b+1越界的問題,再求最值的時候我是將區間擴建成

[0,n + 1]

,但是這個求和的由於用了

size

,所以多出來節點是不允許的,不過也可以加一些限制,就是變麻煩了。其實分情況討論一下就可以了,當

a=1或

b=n時,只旋轉

a-1

或b+1

就可以了,這樣也能那個得到我們想要的一顆子樹(這個子樹裡只包括a到

b的節點)

在這裡卡了一段時間,還是對問題的本質不理解啊,只怪一開始沒能理解旋轉

a-1和

b+1的目的是為了構造一顆子樹(這個子樹裡只包括a到

b的節點)。 2

:乙個節點記錄的資訊到底代表什麼,節點的

sum域代表的是以這個節點為根的所有子樹的總和,那麼當我們修改的乙個節點不是根節點的時候,我們就必須將這個節點的所有祖先節點全部更新。

不過最後時間是

2800+

,看到網上很多

5000

的,也算給自己安慰了

ac code:

#include

#include

#include

using namespace std;

typedef long long i64;

#define maxn 1000000

i64 num[maxn], n;

struct splaytreenode

};

struct splaytree

~splaytree()

void copy(splaytreenode* &x, splaytreenode* &y, int co)

void rotate(splaytreenode* &rt, int son1, int son2)

temp->son[son2] = rt;

temp->father = rt->father;

copy(temp, rt, 1);

temp->id = rt->id;

rt->father = temp;

rt->id = son2;

rt = temp;

}

void splay(splaytreenode* x, splaytreenode* rt)

else

else

}

splay(x, rt);

}

void built(int l, int r, int sid, splaytreenode* &rt, splaytreenode* fa)

}

void replace(splaytreenode* &rt, i64 data)

void down(splaytreenode* &rt)

rt->renew = 0;

}

splaytreenode* find(i64 x, splaytreenode* rt)

void updata(i64 a, i64 b, i64 c)

else

} else

else

} }

i64 answer(i64 a, i64 b)

else

} else

else

} }

};

int main()

} }

return 0; }

區間翻轉問題 Splay

問題描述 給你乙個長度為n的序列和m個操作 1.查詢第k個數的值 2.將第k個數增加d 3.查詢一段區間的和 4.查詢一段區間的最大值 5.將一段區間鏡面翻轉 例如序列,將從2到5的區間翻轉後得到序列 對於除操作2,5以外的操作,輸出相應的答案 輸入格式 第一行兩個正整數n,m 第二行n個整數,為初...

Splay解決區間問題 區間更新,區間求和

區間更新,區間求和 注意各種編碼細節,特別是splay buildtree和 rotateto 仔細體會與線段樹解決區間問題的不同點,如結點記錄的資訊是不同的 lazy思想 include include includeusing namespace std const int maxn 11111...

Splay之區間翻轉問題

給你 n 個數 分別為 1,2,3,4 n 然後有 m 個操作,每個操作對應一段區間,將區間的數進行翻轉。比如 1,2,3,4,5 這段序列 操作區間為 2 4 翻轉完成後的序列為 1,4,3,2,5 第一行分別輸入 n,m 第2行到m 1行每行輸入兩個數 對應操作的區間 輸出最後翻轉完成後的序列 ...