嘟嘟嘟
這題我寫的時候還是挺順的,邊寫邊想為啥學姐說我是「勇士」。然後我用了大半天的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 來說不在話下,只要多打兩個標記就可以了。但是如何求最大子段和?於是乎我們再打三個標記來維護它 霧 然後我們...