你工作以後, 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...