#include#include#include#include#include#define fo(i,a,b) for(i=a;i<=b;i++)#define fod(i,a,b) for(i=a;i>=b;i--)
using namespace std;
const int maxn=520007;
int i,j,k,l,n,m,ans,root,posi;
int f[maxn],a[maxn],d[maxn],b[maxn],x,y,key[maxn],shan[maxn],num,zhi,tt[maxn][2];
char s[20];
struct nodet[maxn];
void update(int x)
void makesame(int x,int y)
bool son(int x)
void rotate(int x)
void overturn(int x)
void down(int x)
if(t[x].add!=maxn) }
void remove(int x,int y)
while(x!=y);
while(d[0])down(d[d[0]--]);
}int insert(int x)
void splay(int x,int y)
if(!y)
root=x;
}int build(int l,int r,int y)
int kth(int x,int k)
void del(int x)
int main()
else if(s[0]=='d')
//從第posi個位置開始,刪除k個元素
else if(s[2]=='k')
//連續k個數字,值改為某個固定值
else if(s[0]=='r')
//從第posi個數字開始,翻轉其後的k個數字
else if(s[0]=='g')
//從第posi個數字開始,k個數字之和
else
}}
poj3580
#include using namespace std;#define n 510000
#define ls(x) ch[x][0]
#define rs(x) ch[x][1]
#define which(x) (ch[fa[x]][1]==x)
#define inf 0xfffffff
int n,m,cnt,root,lp,rp;
char s[11];
int ch[n][2],a[n];
int val[n],ad[n],size[n],rev[n],mn[n],fa[n];
void read(int &x)
void update(int x)
int build(int l,int r)
void reverse(int x)
void add(int x,int v)
void pushdown(int x)
if(ad[x])
}void down(int x)
void rotate(int x)
void splay(int x,int tar)
}if(tar==0)root=x;
}int rank(int x,int k)
int get(int l,int r)
int main()
else if(s[1]=='i')
else if(s[1]=='m')
else if(s[1]=='d')
else if(s[4]=='e')
else
}}
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 來說不在話下,只要多打兩個標記就可以了。但是如何求最大子段和?於是乎我們再打三個標記來維護它 霧 然後我們...