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操作,向輸出檔案依次列印結果,每個...