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
6in 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 ...