輸入檔案的第1行包含兩個數n和m,n表示初始時數列中數的個數,m表示要進行的運算元目。第2行包含n個數字,描述初始時的數列。以下m行,每行一條命令,格式參見問題描述中的**。
對於輸入資料中的get-sum和max-sum操作,向輸出檔案依次列印結果,每個答案(數字)佔一行。
9 82 -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
-110110
splay區間操作模板
毒瘤乙個,splay這個資料結構就夠有毒了,一遍必卡,得苦逼的慢慢debug
這題的資料範圍也有毒性,必須**被刪掉的數
否則mle
最大子串行啊什麼的,線段樹怎麼維護的就怎麼維護,反正這棵樹維護的是樹上的編號,而不是對應的值(這個不知道怎麼表述,學久了就理解了)
**(巨難寫,寫過最長**):
1 #include2 #include3 #include4 #include5using
namespace
std;
6int
sz,root;
7int ch[800001][2],d[800001],v[800001],f[800001],size[800001],sum[800001],tot,mx[800001],lx[800001],rx[800001],id[800001],flag[800001];bool used[800001];8
intn,l,r,m;
9void read(int &x)
14 queues;
15 inline bool
get(int
x)16
19void update(int
x)20
29void pushdown(int
now)
3042
else
4347}48
if(used[now])
4955}56
void move(int now,int &k)
5769
void splay(int x,int &k)
7081
move(x,k);82}
83}84void build(int l,int r,int
fa)85
94else build(l,mid-1,mid),build(mid+1
,r,mid);
95 v[now]=d[mid];f[now]=last;update(now);
96 ch[last][mid>=fa]=now;97}
98int find(int k,int
x)99
105void rec(int
x)106
113void ins(int k,int
b)114
126void del(int l,int
r)127
134void change(int k,int b,int
num)
135144
intmain()
145165
if(p[3]=='
s')//
插入 166
read(a),read(b),ins(a,b);
167if(p[3]=='
l')//
刪除 168
172if(p[3]=='
k')//
修改 173
177if(p[3]=='
t')//
求和178
184if(p[3]=='
x')//
最大連續和
185 printf("
%d\n
",mx[root]);
186}
187 }
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 內。插入的數字總數不...