BZOJ1500 維修數列 splay

2021-09-10 06:06:41 字數 1428 閱讀 6667

orz hzwer...

lx[x]表示x的子樹的中序遍歷的最左節點開始向右的最大和,可以在任意地方結束,rx[x]表示x這棵子樹的中序遍歷最右節點開始向左的最大和。mx[x]是這棵子樹的最大值,這樣就很好維護了。

tag[x]是這棵子樹被全部賦值的標記,rev[x]是這棵子樹被反轉的標記

#include#include#include#include#define maxl 1000010 

#define inf 2000000001

// orz hzwer

using namespace std;

int n,m,cnt,rt;

int a[maxl],fa[maxl],tr[maxl][2],id[maxl];

int sum[maxl],v[maxl],mx[maxl],size[maxl],lx[maxl],rx[maxl];//v==val

bool rev[maxl],tag[maxl];

queue q;

inline int read()

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

return x*d;

}inline void update(int x)

inline void pushdown(int x)

else

}if(rev[x]) }

inline void rotate(int x,int &k)

inline void splay(int x,int &k)

rotate(x,k); }}

inline int find(int k,int rk)

inline void rec(int x)

inline int split(int k,int tot)

inline void query(int k,int tot)

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

inline void rever(int k,int tot)

}inline void erase(int k,int tot)

inline 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);

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

}

inline void insert(int k,int tot)

int main()

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

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

} return 0;

}

BZOJ 1500, 維修數列

傳送門 編寫乙個支援插入 刪除 修改 翻轉 求和以及求和最大子串行的資料結構。splay無疑。但是寫太醜也是會tle的,比方說插入的時候應該以建樹的形式插入,而不是乙個點乙個點的形式。實現起來要注意的細節很多,對練習打splay挺有好處。陸陸續續除錯了好多天,總算在崩潰之前ac了 include c...

BZOJ 1500 維修數列

time limit 10 sec memory limit 64 mb submit 14433 solved 4701 submit status discuss 輸入的第1 行包含兩個數n 和m m 20 000 n 表示初始時數列中數的個數,m表示要進行的運算元目。第2行包含n個數字,描述初...

bzoj 1500 維修數列

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