BZOJ1500 NOI2005 維修數列

2022-05-05 01:30:14 字數 1756 閱讀 2009

time limit: 10 sec  memory limit: 64 mb

submit: 14486  solved: 4723

[submit][status][discuss]

輸入的第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 -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

思路

#include#define rg register

#define il inline

#define n 1000005

#define rs (ch[x][1])

#define ls (ch[x][0])

using namespace std;

int ch[n][2],fa[n],sum[n],l[n],r[n],sz[n],v[n],max[n],rt,id[n],a[n],n,m,cnt;bool tag[n],rev[n];

void up(int x)

void down(int x)else

}if(rev[x])rev[x]^=1,rev[rs]^=1,rev[ls]^=1,swap(rs,ls),swap(l[rs],r[rs]),swap(l[ls],r[ls]);

}void rotate(int x,int &k)

void splay(int x,int &k)rotate(x,k);

}}queueque;

int find(int x,int rnk)

void clean(int x)

int split(int k,int tot)

void querysum(int k,int tot)

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

void rever(int k,int tot)

}void del(int k,int tot)

#define mid ((l+r)>>1)

void build(int l,int r,int f)else build(l,mid-1,mid),build(mid+1,r,mid);

v[x]=a[mid],fa[x]=faa;up(x);

ch[faa][f<=mid]=x;

}void insert(int k,int tot)int k,tot;

int main()

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

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

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

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

if(s[0]=='m'&&s[2]=='x')

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