hdu 5249 權值線段樹)

2021-09-29 17:48:45 字數 1847 閱讀 4712

一道權值線段樹的題:也不算是板子題,變相求第k大

題解:

由於資料範圍比較大,所以需要離散化,二分+vector是我目前已知的最快的一種方法,這題就是乙個變相求第k大問題,然後用佇列模擬一下指令輸入即可

ac**:

#include

#include

using namespace std;

#include

#include

#include

using namespace std;

//求第k大

const int maxn=

1e4+5;

int a[maxn]

;vector<

int>vec;

int getid(

int x)

//離散化

struct node

tree[maxn*4]

;//這裡需要注意一下,需要開大一點,不然就wa了

void pushup(

int k)

void build(

int k,

int l,

int r)

int mid=

(l+r)

>>1;

build(k<<

1,l,mid)

; build(k<<1|

1,mid+

1,r);}

void update(

int k,

int pos,

int w)

int mid=

(tree[k]

.l+tree[k]

.r)>>1;

if(mid>=pos)

update(k<<

1,pos,w)

;else

update(k<<1|

1,pos,w)

; pushup(k);}

int query_kth(

int k,

int ik)

if(tree[k<<1]

.sum

>=ik)

return query_kth(k<<

1,ik)

;else

return query_kth(k<<1|

1,ik-tree[k<<1]

.sum);

}int main(

)else

if(op[0]

=='o'

)else

if(op[0]

=='q')}

sort(vec.begin(

),vec.end())

; vec.erase(unique(vec.begin(

),vec.end())

,vec.end())

;//printf(

"%d\n"

,vec.size())

; build(1,

1,vec.size())

; printf(

"case #%d:\n",+

+id);

for(

int i=

1; i<=n; i++)

if(a[i]==-

1)else

if(a[i]==-

2)}//printf(

"%d\n"

,que.size())

;}}

KPI(HDU 5249)權值線段樹

你工作以後,kpi 就是你的全部了.我開發了乙個服務,取得了很大的知名度。數十億的請求被推到乙個大管道後同時服務從管頭拉取請求。讓我們來定義每個請求都有乙個重要值。我的kpi是由當前管道內請求的重要值的中間值來計算。現在給你服務記錄,有時我想知道當前管道內請求的重要值得中間值。有大約100組資料。每...

權值線段樹

維護全域性的值域資訊,每個節點記錄的是該值域的值出現的總次數。使用二分的思想 離散化的時候,需要用到 支援查詢全域性k小值,全域性rank,前驅,後繼等。單詞操作時間複雜度為o logn 空間複雜度為o n 相對於平衡樹的優勢 簡單,速度快 劣勢 值域較大時,我們需要離散化,變成離線資料結構 我認為...

權值線段樹

include using namespace std int n,m,tre 10003 4 laz 10003 4 void pushdown int num void update int num,int le,int ri,int x,int y,int z pushdown num int...