NOI2005 維護數列

2022-05-09 11:03:12 字數 1994 閱讀 5885

嘟嘟嘟

這題我寫的時候還是挺順的,邊寫邊想為啥學姐說我是「勇士」。然後我用了大半天的debug時間理解了這句話……

先不說那幾個把人坑到退役的點,光說這幾個操作,其實都聽基礎的。

我感覺唯一要說一下的就是插入一串數:我們先把這些數建成乙個splay,然後把這個splay的根節點連到對應的點的兒子節點即可。

然後有幾個地方一定要注意:

1.這道題需要垃圾**,就是重複利用刪除的節點編號。對於刪除的子樹,遍歷一下,用棧把編號存下來即可。

2.建樹的時候一定要把標記清零,因為我們是重複利用節點。要不然就在垃圾**的時候清零也行。

3.關於區間覆蓋標記,不能將他設為要修改的值,因為可能會修改成0。導致這種情況會被判斷成沒有修改。因此這個標記開乙個bool變數,1表示修改了,0表示沒修改。

最後就是那個坑點了:pos後連續的k個字元,k可能是0!!因此這個必須特判掉,而且面對詢問不能直接continue,而是得固輸0……

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define enter puts("")

#define space putchar(' ')

#define mem(a, x) memset(a, x, sizeof(a))

#define in inline

typedef long long ll;

typedef double db;

const int inf = 0x3f3f3f3f;

const db eps = 1e-8;

const int maxn = 2e6 + 5;

inline ll read()

inline void write(ll x)

int n, m, a[maxn];

char c[20];

struct tree

t[maxn];

int root, tcnt = 0;

int st[maxn], top = 0;

#define ls t[now].ch[0] //only for now!!!

#define rs t[now].ch[1]

in void _printtr(int now)

in void c_rev(int now)

in void c_cg(int now, int lzy)

in void pushdown(int now)

if(t[now].rev)

}in void pushup(int now)

in void rotate(int x)

in void splay(int x, int s)

if(!s) root = x;

}in int build(int l, int r, int _f)

in int find(int k)

}in int split(int l, int r)

in void update_in(int l, int r) //all plus one !!

in void rec(int& now)

in void del(int l, int r)

in void update_cg(int l, int r, int d)

in void update_rev(int l, int r)

in int query_sum(int l, int r)

int main()

else if(c[0] == 'd')

else if(c[2] == 'k')

else if(c[0] == 'r')

else if(c[0] == 'g')

else write(t[root].imax), enter;

}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好久的命運 我是使用 fhq treap 來做的這道題。寫的時候寫的挺爽的 調的時候真難受。首先我們先來說說咋做吧。前5個操作對於 fhq treap 來說不在話下,只要多打兩個標記就可以了。但是如何求最大子段和?於是乎我們再打三個標記來維護它 霧 然後我們...