HDU 5429 KPI(樹狀陣列)

2021-07-02 23:15:39 字數 1775 閱讀 9265

problem description

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

input

有大約100組資料。

每組資料第一行有乙個 n

(1≤n

≤10000

) ,代表服務記錄數。

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

"in x": 代表重要值為 x

(0≤x

≤109)

的請求被推進管道。

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

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

loor

(m/2

)+1t

h  條請求的重要值.

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

output

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

case #i:

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

sample input

6

in 874

query

outin 24622

in 12194

query

sample output

case #1:

87424622

單點更新:離散化,然後在樹狀陣列+二分搞一下。

#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define repf( i , a , b ) for ( int i = a ; i <= b ; ++ i )

#define rep( i , n ) for ( int i = 0 ; i < n ; ++ i )

#define clear( a , x ) memset ( a , x , sizeof a )

typedef long long ll;

typedef pairpil;

const int inf = 0x3f3f3f3f;

const int maxn=1e4+10;

int c[maxn+100];

int n,a[maxn],b[maxn];

char str[maxn][10];

int lowbit(int x)

void update(int x,int val)

return sum;

}void solve(int x)

printf("%d\n",b[l]);

}int main()

}sort(b+1,b+cnt);

cnt=unique(b+1,b+cnt)-(b+1);

printf("case #%d:\n",cas++);

repf(i,1,n)

else if(str[i][0]=='o')

else

solve(q.size());}}

return 0;}/*

*/

hdu 3887 樹狀陣列

給你一棵樹,每個節點都有個編號。讓你求乙個節點他的子樹中編號比他小的節點有幾個。編號唯一,從1 n,已給出根節點 解 樹狀陣列統計。轉化為線性序列。可以想到的是,若要統計乙個節點,那麼比它小的孩子必須先插完,然後統計就行了。對於乙個節點i來說,只要把所有x那麼對於所有節點來說也是這樣的,從一開始插,...

hdu 3333 樹狀陣列

此題與3743相仿,但本題資料較大,需要用到離散化。如何去掉重複元素呢?採用離線演算法 首先將詢問按右端點從小到大排序,離線處理時,記錄每個元素所在位置,遇到重複元素時,從它之前出現的位置減去這個元素,這樣就是的每個元素總是出現在最後。include include include include ...

樹狀陣列 HDU1166

繼續上次那題,我們現在採用樹狀陣列來解。樹狀陣列主要用來進行區間求和統計和定點更新操作,樹狀陣列的儲存是如下方式的 假設陣列a為a 1 a 2 a 3 a n 現在我們另陣列c 1 a 1 c 2 a 1 a 2 c 3 a 3 c 4 a 1 a 2 a 3 a 4 這是啥結構呢?其實c i a ...