NOI2005 維護數列

2022-05-05 17:24:11 字數 1942 閱讀 8525

傳送門

我還是沒有逃過在這道題上debug好久的命運……

我是使用\(fhq-treap\)來做的這道題。寫的時候寫的挺爽的……調的時候真難受。

首先我們先來說說咋做吧。前5個操作對於\(fhq-treap\)來說不在話下,只要多打兩個標記就可以了。但是如何求最大子段和?

於是乎我們再打三個標記來維護它……(霧

然後我們就開始非常開心的敲。敲完之後發現,de不出來啊……

這裡有以下和正確性相關的細節。

1.merge的時候,要先進行pushdown。我們一般的寫法,是只要遇到有乙個空樹就進行返回。但是這道題中因為要維護最大子段和,需要用左右的來歸併,而如果其中有一棵是空樹,就會導致另乙個沒有pushdown,從而影響答案的正確性。

2.在區間翻轉的時候要注意。我們需要先翻**己的左右兒子,之後在標記下放的時候,對左右兒子旋轉左右兒子。

3.注意一點就是,對於乙個區間的從左/右開始的連續最大子段和,我們必須在它的左/右兒子存在的時候才可以進行更新。乙個重要原因是這題有負數,就會導致你把負的答案改成0,使得出錯。

4.這個題因為插入和刪除很多,所以要進行垃圾**。**之後再拿出來的時候,我們需要進行重置,清空所有原來的資料,否則一旦與原來有關聯就不知道會發生啥了。

之後還是有好多細節的……基本上都是對於最大子段和的更新過程,確實是比較繁瑣的,需要時刻判斷一下是否有左右兒子存在來進行計算。

看一下**。

// luogu-judger-enable-o2

#include#define rep(i,a,n) for(int i = a;i <= n;i++)

#define per(i,n,a) for(int i = n;i >= a;i--)

#define enter putchar('\n')

#define i inline

using namespace std;

typedef long long ll;

const int m = 1000005;

i int read()

while(ch >= '0' && ch <= '9') ans = ans * 10 + ch - '0',ch = getchar();

return ans * op;

}struct tree

t[m<<1];

int bin[m<<3],bintop,n,m,tot,sta[m<<1],top;

char s[20];

i int newnode(int x)

i void pushup(int x)

i void rever(int x)

i void cover(int x,int v)

i void pushdown(int x)

if(t[x].opt)

}int build(int l,int r,int *a)

int merge(int x,int y)

else

}void splits(int u,int k,int &x,int &y)

}void restore(int x)

int a[m<<2],root,pos,num,x,y,z;

int main()

splits(root,pos-1,x,y),splits(y,num,z,y);

printf("%d\n",t[z].sum);

root = merge(x,merge(z,y));

}if(s[0] == 'i')

if(s[0] == 'd')

if(s[0] == 'm' && s[2] == 'k')

if(s[0] == 'm' && s[2] == 'x') printf("%d\n",t[root].mx);

if(s[0] == 'r')

}return 0;

}

noi2005維護數列

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

NOI2005 維護數列

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

NOI2005 維護數列

嘟嘟嘟 這題我寫的時候還是挺順的,邊寫邊想為啥學姐說我是 勇士 然後我用了大半天的debug時間理解了這句話 先不說那幾個把人坑到退役的點,光說這幾個操作,其實都聽基礎的。我感覺唯一要說一下的就是插入一串數 我們先把這些數建成乙個splay,然後把這個splay的根節點連到對應的點的兒子節點即可。然...