zoj 3633 線段樹單點更新 區間最大值

2021-06-09 03:40:22 字數 1219 閱讀 1919

/*

解法是,先把所有數字從小到大排序,相同的按出現的先後順序排序。

查詢時,[a,b]就是查詢區間[a,b]中大於等於a的最大值。如果最大值都小於a,那麼就說明沒有重複的。

比如上面的資料1 2 3 1 2,排序後就是:

1 1 2 2 3

pos:1 4 2 5 3

再次排序後:

pos: 1 2 3 4 5

key: 0 0 0 1 2

那麼 顯然【1,4】的答案為 x[1],[1,5]的答案為x[2];

[x,y]中key 的最大值#include#include#includeusing namespace std;

#define lson rt<<1,l,mid

#define rson rt<<1|1,mid+1,r

const int maxn=500002;

const int maxm=50002;

struct node

p[maxn<<2];

int pos[maxn],n,m,ans,max[maxn<<2],x[maxn];

void pushup(int rt)

void build(int rt,int l,int r)

int mid=(l+r)>>1;

build(lson);

build(rson);

pushup(rt);

}void update(int rt,int l,int r,int idx,int data)

int mid=(l+r)>>1;

if(mid>=idx) update(lson,idx,data);

else update(rson,idx,data);

pushup(rt);

}int query(int rt,int l,int r,int l,int r)

int mid=(l+r)>>1;

int s1=0,s2=0;

if(mid>=l) s1=query(lson,l,r);

if(r>mid) s2=query(rson,l,r);

return max(s1,s2);

}int cmp1(node a,node b)

else printf("ok\n");

}cout<}

return 0;

}

單點更新,區間查詢線段樹

線段樹的空間複雜度是4n include include include using namespace std const int maxn 100005 const int inf 0x3f3f3f3f int n,a maxn struct node 結點 tree maxn 4 樹結點儲存陣...

線段樹 學習 模板 單點更新 區間更新

線段樹是幹什麼的?有一列數,每次可以進行以下三種操作中的一種 1 給指定區間中的每個數都加上某個值 2 將指定區間內的所有數置成某乙個統一的值 3 詢問乙個區間上的最小值 最大值 所有數的和。樸素做法怎麼做?用線性表儲存,每種操作,對待處理或待詢問區間中的每個元素都逐一進行處理。複雜度多少?假設這個...

I Hate It 線段樹單點更新區間查詢

很多學校流行一種比較的習慣。老師們很喜歡詢問,從某某到某某當中,分數最高的是多少。這讓很多學生很反感。不管你喜不喜歡,現在需要你做的是,就是按照老師的要求,寫乙個程式,模擬老師的詢問。當然,老師有時候需要更新某位同學的成績。input 本題目包含多組測試,請處理到檔案結束。在每個測試的第一行,有兩個...