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 內。插入的數字總數不...