傳送門
我還是沒有逃過在這道題上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的根節點連到對應的點的兒子節點即可。然...