KPI(HDU 5249)權值線段樹

2021-10-02 15:42:20 字數 2103 閱讀 6138

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

有大約100組資料。

每組資料第一行有乙個n(1≤n≤10000),代表服務記錄數。

接下來有n行,每一行有3種形式

「in x」: 代表重要值為x(0≤x≤109)的請求被推進管道。

「out」: 代表服務拉取了管道頭部的請求。

"query: 代表我想知道當前管道內請求重要值的中間值. 那就是說,如果當前管道內有m條請求, 我想知道,公升序排序後第floor(m/2)+1th 條請求的重要值.

為了讓題目簡單,所有的x都不同,並且如果管道內沒有值,就不會有"out"和"query"操作。

對於每組資料,先輸出一行

case #i:

然後每一次"query",輸出當前管道內重要值的中間值。

6

in 874

query

outin 24622

in 12194

query

case #1:

87424622

這道題的解決方法也有好幾種,我今天來說一下用權值線段樹來解決這道題的方法。

咋一看,就是權值線段樹的板子題,寫著寫著突然發現,這個數的值有點大,我們都知道,權值線段樹是用值域來開陣列範圍大小。所以我們還需要對這個儲存進行離散化一下。因為這道題給的操作不多,所以我們可以先儲存,然後再掛到樹上,這樣就可以順利解決這道題了。

#include

#include

#include

#include

#include

using

namespace std;

int tree[

40005];

int a[

10005];

int b[

10005];

char s[20]

;void

build

(int l,

int r,

int k)

int mid=

(l+r)/2

;build

(l,mid,k*2)

;build

(mid+

1,r,k*2+

1); tree[k]

=tree[k*2]

+tree[k*2+

1];}

void

add(

int l,

int r,

int k,

int x,

int op)

int mid=

(l+r)/2

;if(mid>=x)

else

tree[k]

=tree[k*2]

+tree[k*2+

1];}

intxth

(int l,

int r,

int k,

int x)

int mid=

(l+r)/2

;if(tree[k*2]

>=x)

else

}int

main()

else

if(s[0]

=='o'

)else

}//printf("%d\n",sum);

build(1

,sum,1)

;sort

(b+1

,b+sum+1)

;printf

("case #%d:\n"

,tot++);

for(

int i=

1;i<=n;i++

)else

if(a[i]==-

1)else}}

return0;

}

hdu 5249 權值線段樹)

一道權值線段樹的題 也不算是板子題,變相求第k大 題解 由於資料範圍比較大,所以需要離散化,二分 vector是我目前已知的最快的一種方法,這題就是乙個變相求第k大問題,然後用佇列模擬一下指令輸入即可 ac include include using namespace std include in...

權值線段樹

維護全域性的值域資訊,每個節點記錄的是該值域的值出現的總次數。使用二分的思想 離散化的時候,需要用到 支援查詢全域性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...