NOI 2005 維修數列

2021-07-02 04:27:29 字數 1652 閱讀 8676

noi 2005 維修數列

典型的伸展樹模板題

參考 

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

#define key_value ch[ch[root][1]][0]

const int maxn = 500010;

const int inf = -(1<<30);

int pre[maxn],ch[maxn][2],key[maxn],sz[maxn];

int root,tot1;

int sum[maxn],rev[maxn],same[maxn];

int lx[maxn],rx[maxn],mx[maxn];

int s[maxn],tot2;//記憶體池和容量

int a[maxn];

int n,q;

void newnode(int &r,int father,int k)

void update_rev(int r)

void update_same(int r,int v)

void push_up(int rt) //更新資訊

void push_down(int r) //消除該節點的same和rev

if(rev[r])

}void build(int &x,int l,int r,int father) //建樹

void init()

//旋轉,kind,0為左旋,1為右旋

void rotate(int x,int kind)

//splay調整,將r結點調整到goal下面

void splay(int r,int goal)

else

else}}

push_up(r);

if(goal == 0) root = r;

}int get_kth(int r,int k)

//在第pos個數後面插入tot個數

void insert(int pos,int tot)

//刪除子樹

void deletetree(int r)

//從第pos個數開始連續刪除tot個數

void delete(int pos,int tot)

//將從第pos個數開始的連續的tot個數修改為c

void make_same(int pos,int tot,int c)

//將第pos個數開始的連續tot個數進行反轉

void reverse(int pos,int tot)

//得到第pos個數開始的tot個數的和

int get_sum(int pos,int tot)

//得到第pos個數開始的tot個數中最大的子段和

int get_maxsum(int pos,int tot)

int main()

else if(op[0]=='d')

else if(op[0]=='r')

else if(op[0]=='g')

else if(op[0]=='m')

else }}

}return 0;

}

NOI2005 維修數列

輸入的第1 行包含兩個數n 和m m 20 000 n 表示初始時數列中數的個數,m表示要進行的運算元目。第2行包含n個數字,描述初始時的數列。以下m行,每行一條命令,格式參見問題描述中的 任何時刻數列中最多含有500 000個數,數列中任何乙個數字均在 1 000,1 000 內。插入的數字總數不...

維修數列 NOI2005

好久沒寫題解了 來水一篇題解 請寫乙個程式,要求維護乙個數列,支援以下 6 種操作 輸入的第1行包含兩個數 n 和 m m leq 20 000 n 表示初始時數列中數的個數,m 表示要進行的運算元目。第2行包含 n 個數字,描述初始時的數列。以下 m 行,每行一條命令,格式參見問題描述中的 任何時...

1500 NOI2005 維修數列

題目思路 splay 包括區間插入,區間刪除,記憶體,區間反轉,區間和,區間最大子段,成段更新等操作。include include include include include include include include include include includeusing namesp...