BZOJ1500 NOI2005 維修數列

2021-07-07 07:24:12 字數 3029 閱讀 1229

description

input

輸入檔案的第1行包含兩個數n和m,n表示初始時數列中數的個數,m表示要進行的運算元目。第2行包含n個數字,描述初始時的數列。以下m行,每行一條命令,格式參見問題描述中的**。

output

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

sample input

9 8

2 -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

sample output

-1 10

1 10

source

splay

solution :

半條命。

code :

#include 

using

namespace

std;

#define rep(i, l, r) for (int i = (l); i <= (r); i++)

#define per(i, r, l) for (int i = (r); i >= (l); i--)

#define rep(i, n) for (int i = 0; i < (n); i++)

#define per(i, n) for (int i = (n)-1; i >= 0; i--)

#define stack _stack

const

int inf = ~0u>>2;

const

int n = 555555;

template

inline

void read(t &x)

while (isdigit(ch))

x *= f;

}template

inline

void write(t x)

if (x < 0)

while (x) a[ptr++] = x % 10, x /= 10;

per(i, ptr-1, 0) putchar('0' + a[i]);

putchar('\n');

}struct info

void mark_rev()

void set_one(int t)

};inline

void merge_info(info &f, const info &l, const info &r)

struct mark

void mark_rev()

void clear()

};struct node

void sc(node *_c, bool _d)

}*null, *root;

inline

void mark_same(node *t, int same)

inline

void mark_rev(node *t)

node mem[n];

node *stack[n]; int top;

int n, m, a[n];

char opt[n];

inline

void init_memory()

inline node *new_node()

inline node *new_node(int val)

inline

void delete_node(node *t)

inline

void init_null()

inline

void sweep(node *t_root)

}inline

void push_down(node *t)

if (m.rev)

}inline

void push_up(node *t)

inline

void rotate(node *t)

inline

void splay(node *t, node *f)

push_up(t);

}inline node *make_tree(int *l, int *r)

int *mid = l+(r-l)/2;

node *t = new_node(*mid);

t->sc(make_tree(l, mid), 0); t->sc(make_tree(mid+1, r), 1);

push_up(t);

return t;

}inline node *find(int k)

}node *&getseq(int l, int r)

inline

void build()

inline

void _insert(int tot, int pos)

inline

void _delete(int tot, int pos)

inline

void _reverse(int tot, int pos)

inline

void _modify(int tot, int pos, int val)

inline

void _calc_sum(int tot, int pos)

inline

void _calc_max()

inline

void solve() ok

break;}}

}int main()

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

bzoj1500 NOI2005 維修數列

description input 輸入檔案的第1行包含兩個數n和m,n表示初始時數列中數的個數,m表示要進行的運算元目。第2行包含n個數字,描述初始時的數列。以下m行,每行一條命令,格式參見問題描述中的 output 對於輸入資料中的get sum和max sum操作,向輸出檔案依次列印結果,每個...