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