這道題蒟蒻花了一天半才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 來說不在話下,只要多打兩個標記就可以了。但是如何求最大子段和?於是乎我們再打三個標記來維護它 霧 然後我們...