BZOJ1500 NOI2005 維修數列

2021-08-20 09:16:21 字數 1979 閱讀 9187

主要參考hzwer。

輸入檔案的第1行包含兩個數n和m,n表示初始時數列中數的個數,m表示要進行的運算元目。第2行包含n個數字,描述初始時的數列。以下m行,每行一條命令,格式參見問題描述中的**。

對於輸入資料中的get-sum和max-sum操作,向輸出檔案依次列印結果,每個答案(數字)佔一行。

9 8

2 -6 3 5 1 -5 -3 6 3

get-sum 5 4

max-sum

insert 8 3 -5 7 2

delete 12 1

make-same 3 3 2

reverse 3 6

get-sum 5 4

max-sum-1

10 1

10這是一道經典的splay模板題

入門建議閱讀《伸展樹的基本操作與應用》,以及手畫練習

以下模板是結合前人經驗,經多次修改後的結果

c分別是結點左右兒子,fa是結點父親

size是子樹大小,sum是子樹權值和,v是結點權值,mx是當前子樹的最大子串和

lx是乙個子樹以最左端為起點向右延伸的最大子串和,rx類似

tag是結點的修改標記,修改值為v,rev是翻轉標記

code:

#include#include#include#include#include#include#include#define n 1000005

#define inf 1000000000

using namespace std;

int n,m,root,cnt,a[n],id[n],fa[n],c[n][2];

int sum[n],size[n],v[n],mx[n],lx[n],rx[n],tag[n],rev[n];

queueq;

inline int read()

while(s>='0'&&s<='9')

x*=f;

return x;

}void update(int x)

void pushdown(int x)

else

}if(rev[x]) }

void rotate(int x,int &k)

void splay(int x,int &k)

rotate(x,k); }}

int find(int x,int k)

void rec(int x)

int split(int k,int tot)

void query(int k,int tot)

void modify(int k,int tot,int val)

void rever(int k,int tot)

}void erase(int k,int tot)

void build(int l,int r,int f)

else

build(l,mid-1,mid),build(mid+1,r,mid);

v[now]=a[mid];fa[now]=last;

update(now);

c[last][mid>=f]=now;

}void insert(int k,int tot)

else id[i]=++cnt;

build(1,tot,0);

int mid=(1+tot)>>1;

int now=id[mid];

int x=find(root,k+1),y=find(root,k+2);

splay(x,root);splay(y,c[x][1]);

fa[now]=y;c[y][0]=now;

update(y);update(x);

}int main()

} if(ch[0]=='r')rever(k,tot);

if(ch[0]=='g')query(k,tot);

} return 0;

}

BZOJ1500 NOI2005 維修數列

description input 輸入檔案的第1行包含兩個數n和m,n表示初始時數列中數的個數,m表示要進行的運算元目。第2行包含n個數字,描述初始時的數列。以下m行,每行一條命令,格式參見問題描述中的 output 對於輸入資料中的get sum和max sum操作,向輸出檔案依次列印結果,每個...

bzoj1500 NOI2005 維修數列

splay鼻祖級的題目?霧。insert 把第pos個數 有哨兵節點 轉到root,把第pos 1個數轉到root的右兒子,然後對c建樹然後把這棵樹插到root右兒子的左兒子處 delete 把第pos個數轉到root,把第pos tot 1個數轉到root右兒子,刪掉root右兒子的左兒子 變成0...

BZOJ 1500 NOI2005 維修數列

輸入的第1 行包含兩個數n 和m m 20 000 n 表示初始時數列中數的個數,m表示要進行的運算元目。第2行包含n個數字,描述初始時的數列。以下m行,每行一條命令,格式參見問題描述中的 任何時刻數列中最多含有500 000個數,數列中任何乙個數字均在 1 000,1 000 內。插入的數字總數不...