/*
解法是,先把所有數字從小到大排序,相同的按出現的先後順序排序。
查詢時,[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 本題目包含多組測試,請處理到檔案結束。在每個測試的第一行,有兩個...