//
// created by zhengwei.
//#include using namespace std;
const int maxn = 5e4 + 1;
int n = 6;
int data = ;//原始資料,第乙個數字作廢
/*===線段樹,求區間最值===*/
class segtree
};/**
* @param pid 陣列下標,一般從1開始
* @param l 區間起點
* @param r 區間終點
*/segtree *build(int l, int r)
int mid = l + ((r - l) >> 1);
root->tl = build(l, mid);//左子
root->tr = build(mid + 1, r);//右子
root->maxx = max(root->tl->maxx, root->tr->maxx);//回溯更新最值
return root;
}/**
* 單點更新
* @param root
* @param x 要更新的下標
* @param value 新的值
*/void update(segtree *root, int x, int value)
int mid = l + ((r - l) >> 1);
segtree *lson = root->tl;
segtree *rson = root->tr;
if(x<=mid) else
// 回溯更新最值
root->maxx=max(lson->maxx,rson->maxx);
}int query_ans = 0;
/** *
* @param l 左邊界
* @param r 右邊界
* @param from 區間開始
* @param to 區間結束
* @return
*/void query(segtree *root, int ql, int qr)
int mid = l + ((r - l) >> 1);
if (ql <= mid)query(root->tl, ql, qr);
if (qr > mid)query(root->tr, ql, qr);
}/*===線段樹,求區間最值 end===*/
//int data = ;//原始資料,第乙個數字作廢
int main(int argc, const char * ar**)
滑動視窗(poj,線段樹維護區間最值)
現在有一堆數字共n個數字 n 10 6 以及乙個大小為k的視窗。現在這個從左邊開始向右滑動,每次滑動乙個單位,求出每次滑動後視窗中的最大值和最小值。例如 the array is 1 3 1 3 5 3 6 7 and k 3.輸入格式 輸入一共有兩行,第一行為n,k。第二行為n個數 輸出格式 輸出...
最敏捷的機械人(線段樹維護區間最值)
題面 wind設計了很多機械人。但是它們都認為自己是最強的,於是,一場比賽開始了 機器人們都想知道誰是最敏捷的,於是它們進行了如下乙個比賽。首先,他們面前會有一排共n個數,它們比賽看誰能最先把每連續k個數中最大和最小值寫下來,當然,這些機械人運算速度都很,它們比賽的是誰寫得快。但是wind也想知道答...
模板 維護序列2(線段樹)
取模取掛可真是令人質壁分離。兩兩乘積和可以直接用兩個區間的區間和相乘再加上兩個區間各自的乘積和得到,而相鄰乘積和直接兩段相加再加上左區間右端點與右區間左端點乘積就好了。注意 mod mod includeusing namespace std typedef long long ll const l...