NOI2005 維護數列 BSOI2246

2021-07-29 06:02:02 字數 2196 閱讀 6926

這道題蒟蒻花了一天半才a了過去,re了不下二十次。

要a這道題的訣竅就是寫。。。標記的下傳是非常繁瑣的,不過要注意合理的優化下傳的方式。

最讓人頭痛的就是各種邊界和標記了,當然,要是你把splay寫錯了,那麼,對不起,ctrla+delete。。。(根本沒法調)

算了,上**。

#include#include#includeusing namespace std;

inline int read()

int n,m,cnt,root;

int q[500005],c[500005];

struct splay_tree

}tree[500005];

inline void pmax(int v,int f)

inline void up(int v)

inline void same(int v,int x)

inline void rev(int v)

inline void down(int v)

if(tree[v].r)

return ;

}inline void lazy(int v)

inline void rotate(int v)

inline void splay(int v,int goal)up(v);if(!goal)root=v;

return ;

}inline int build(int l,int r,int fa)

inline void re(int v)

int v;

inline void find(int p)

}v=v;return ;

}inline void pre(int x,int y)

inline void insert(int x,int y)

inline void delete(int x,int y)

inline void reverse(int x,int y)

inline void make(int x,int y,int z)

inline int get_sum(int x,int y)

int main(){

tree[0].maxx=tree[0].pmax[0]=tree[0].pmax[1]=-0x3f3f3f3f;

n=read();m=read();int i,x,y,z;char ch[15];

for(i=1;i<=n;i++)c[i]=read();

tree[++cnt].newnode(0,-0x3f3f3f3f);

tree[++cnt].newnode(1,-0x3f3f3f3f);

tree[1].s[1]=2;root=1;insert(1,n);

for(i=1;i<=m;i++){

scanf("%s",ch);

if (ch[0]=='m'){

if (ch[2]=='x')cout<

noi2005維護數列

請寫乙個程式,要求維護乙個數列,支援以下 6 種操作 請注意,格式欄 中的下劃線 表示實際輸入檔案中的空格 操作編號 輸入檔案中的格式 說明1.插入 insert posi tot c1 c2 c tot 在當前數列的第 posi 個數字後插入 tot 個數字 c1,c2,c tot 若在數列首插 ...

NOI2005 維護數列

陳年老題。我就 碼了4k多。主要就是用splay,然後處理區間上的東西 區間反轉就和模板一樣,但是要記得反轉leftmax和rightmax 區間賦值就把那個區間提取出來,然後給子樹根打個same標記,表示下面的全一樣。區間求最大子段和就和線段樹的套路一樣。區間插入就先弄好一顆平衡樹,然後把原平衡樹...

NOI2005 維護數列

傳送門 我還是沒有逃過在這道題上debug好久的命運 我是使用 fhq treap 來做的這道題。寫的時候寫的挺爽的 調的時候真難受。首先我們先來說說咋做吧。前5個操作對於 fhq treap 來說不在話下,只要多打兩個標記就可以了。但是如何求最大子段和?於是乎我們再打三個標記來維護它 霧 然後我們...