BZOJ1500 NOI2005 維修數列

2022-02-04 15:28:20 字數 2281 閱讀 7926

媽呀,寫的我心態崩了,注意以下幾點:

1.標記下放時應該立即更新子節點,才能pushup更新當前結點(此時實際上在當前結點的標記已經使用過了)。

2.最好類似線段樹的建樹方法,否則容易re。

3.寫個**。

4.我這splay寫的是菜出狗屎了,在rotate裡面pushdown,媽呀,就是因為沒注意第一點,而且常數賊大,雖然可以過。

5.其他就是加兩個結點0,n+1,好處理就行了。

#define _crt_secure_no_warnings#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define e exp(1.0)typedef

long

long

ll;#define maxn 500005

#define mod 100000007

#define inf 1000000000

#define fe(i,st,en) for(i = (st);i <= (en);++i)

#define fne(i,st,en) for(i = (st);i < (en);++i)

#define ri register int

#define db double

intn,b[maxn];

struct

splay

int build(int o,int l,int r,int

v)

void pushdown(int o)

if (lazy[o] != -inf)

}void change(int o, int fo, int

v)

int newnode(int fo,int v,int

x)

int isright(int o, int

fo)

void rotate(int

o)

void splay(int o,int

fo)

pushdown(son[o][

0]), pushdown(son[o][1

]); pushup(o);

}int findpos(int o,int pos)

void insert(int pos,int

tot)

void del(int pos, int

tot)

son[son[root][

1]][0] = 0

; pushup(son[root][

1]);

pushup(root);

n -=tot;

}void update(int pos, int tot, int

x)

void reverse(int pos, int

tot)

int querysum(int pos, int

tot)

intquerymax()

}t;int

main()

else

if (s[0] == '

d') scanf("

%d%d

", &p, &k),t.del(p, k);

else

if (s[0] == '

r') scanf("

%d%d

", &p, &k),t.reverse(p, k);

else

if (s[0] == '

g') scanf("

%d%d

", &p, &k),printf("

%d\n

", t.querysum(p, k));

else

if(s[2] == '

k') scanf("

%d%d%d

", &p, &k,&x),t.update(p, k, x);

else printf("

%d\n

", t.querymax());

}return0;

}

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