BZOJ1500 NOI2005 維修數列

2022-05-09 17:33:16 字數 2386 閱讀 5222

[bzoj1500][noi2005]維修數列

試題描述

輸入

輸入的第1 行包含兩個數n 和m(m ≤20 000),n 表示初始時數列中數的個數,m表示要進行的運算元目。

第2行包含n個數字,描述初始時的數列。

以下m行,每行一條命令,格式參見問題描述中的**。

任何時刻數列中最多含有500 000個數,數列中任何乙個數字均在[-1 000, 1 000]內。

插入的數字總數不超過4 000 000個,輸入檔案大小不超過20mbytes。

輸出

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

輸入示例

9

82 -635

1 -5 -363

get-sum 5

4max-sum

insert

83 -572

delete 121

make-same 332

reverse 36

get-sum 5

4max-sum

輸出示例

-1101

10

資料規模及約定

見「輸入

題解

又一道裸題。但是這題維護的東西比較噁心:需要維護節點的值 v、子樹大小 siz、子樹權值和 sum、子樹最大字首和 ml、子樹最大字尾和 mr、子樹最大連續和 ms、權值懶標記 setv 以及反轉標記 rev。然後注意如果乙個子樹 rev = 1(即打了反轉標記),則它的 ml 和 mr 需要互換。

#include #include #include #include #include #include using namespace std;

int read()

while(isdigit(c))

return x * f;

}#define maxn 500010

#define ll long long

#define nosign -2333

#define oo (1ll << 60)

struct node

node(int _): v(_), setv(nosign), rev(0) {}

} ns[maxn];

int rt, tot, fa[maxn], ch[2][maxn], rec[maxn], cc;

bool hs(int o)

void maintain(int o)

int getnode()

int val[maxn], cv;

void build(int& o, int l, int r)

void pushdown(int o)

if(ns[o].rev)

return maintain(o);

}void rotate(int u)

int s[maxn], top;

void splay(int u)

rotate(u);

} return ;

}int split(int u)

int merge(int a, int b)

int qkth(int o, int k)

int nsize;

int find(int k)

void split(int ql, int qr, int& lrt, int& mrt, int& rrt)

void merge(int lrt, int mrt, int rrt)

void recycle(int& o)

void ins(int pos)

void del(int ql, int qr)

void setv(int ql, int qr, int v)

void rev(int ql, int qr)

ll sum(int ql, int qr)

ll mxsum()

int main()

if(cmd[0] == 'd')

if(cmd[0] == 'm' && cmd[2] == 'k')

if(cmd[0] == 'r')

if(cmd[0] == 'g')

if(cmd[0] == 'm' && cmd[2] == 'x') printf("%lld\n", mxsum()), cnt++; }

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