hdu5249---KPI(二分+樹狀陣列)
Problem Description
你工作以後, KPI 就是你的全部了. 我開發了一個服務,取得了很大的知名度。數十億的請求被推到一個大管道後同時服務從管頭拉取請求。讓我們來定義每個請求都有一個重要值。我的KPI是由當前管道內請求的重要值的中間值來計算。現在給你服務記錄,有時我想知道當前管道內請求的重要值得中間值。
Input
有大約100組資料。
每組資料第一行有一個n(1≤n≤10000),代表服務記錄數。
接下來有n行,每一行有3種形式
“in x”: 代表重要值為x(0≤x≤109)的請求被推進管道。
“out”: 代表服務拉取了管道頭部的請求。
“query: 代表我想知道當前管道內請求重要值的中間值. 那就是說,如果當前管道內有m條請求, 我想知道,升序排序後第floor(m/2)+1th 條請求的重要值.
為了讓題目簡單,所有的x都不同,並且如果管道內沒有值,就不會有”out”和”query”操作。
Output
對於每組資料,先輸出一行
Case #i:
然後每一次”query”,輸出當前管道內重要值的中間值。
Sample Input
6
in 874
query
out
in 24622
in 12194
query
Sample Output
Case #1:
874
24622
Source
2015年百度之星程式設計大賽 - 初賽(1)
Recommend
hujie | We have carefully selected several similar problems for you: 5251 5250 5247 5244 5243
用個樹狀陣列來求中位數就行了,二分一下
然後in out 的時候更新下樹狀陣列
/*************************************************************************
> File Name: 1004.cpp
> Author: ALex
> Mail: [email protected]
> Created Time: 2015年05月30日 星期六 17時32分56秒
************************************************************************/
#include <functional>
#include <algorithm>
#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <queue>
#include <stack>
#include <map>
#include <bitset>
#include <set>
#include <vector>
using namespace std;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
const double eps = 1e-15;
typedef long long LL;
typedef pair <int, int> PLL;
static const int N = 10010;
int tree[N];
int xis[N];
int cnt;
int Stack[N << 1];
struct QUE {
int flag;
int op_num;
}que[N];
int BinSearch(int val) {
int l = 1, r = cnt;
int mid;
while (l <= r) {
mid = (l + r) >> 1;
if (xis[mid] == val) {
break;
}
else if (xis[mid] > val) {
r = mid - 1;
}
else {
l = mid + 1;
}
}
return mid;
}
int lowbit(int x) {
return x & (-x);
}
void add(int x, int val, int n) {
for (int i = x; i <= n; i += lowbit(i)) {
tree[i] += val;
}
}
int sum(int x) {
int ans = 0;
for (int i = x; i; i -= lowbit(i)) {
ans += tree[i];
}
return ans;
}
char str[20];
int main() {
int n;
int icase = 1;
while (~scanf("%d", &n)) {
cnt = 0;
int cur;
memset(tree, 0, sizeof(tree));
for (int i = 1; i <= n; ++i) {
scanf("%s", str);
if (str[0] == 'i') {
scanf("%d", &cur);
xis[++cnt] = cur;
que[i].op_num = cur;
que[i].flag = 0; // in num
}
else if (str[0] == 'o') {
que[i].flag = 1; // out
}
else {
que[i].flag = 2; // query
}
}
sort(xis + 1, xis + cnt + 1);
cnt = unique(xis + 1, xis + 1 + cnt) - xis - 1;
printf("Case #%d:\n", icase++);
int s = 0, e = -1, res = 0;
for (int i = 1; i <= n; ++i) {
if (que[i].flag == 0) {
++res;
int val = BinSearch(que[i].op_num);
Stack[++e] = val;
add(val, 1, cnt);
}
else if (que[i].flag == 1) {
--res;
int val = Stack[s];
add(val, -1, cnt);
++s;
}
else {
int l = 1, r = cnt, mid, ans;
while (l <= r) {
mid = (l + r) >> 1;
int les = sum(mid - 1);
int equ = sum(mid);
int m = (res >> 1) + 1;
if (les < m && equ >= m) {
ans = mid;
break;
}
else if (equ < m) {
l = mid + 1;
}
else {
r = mid - 1;
}
}
printf("%d\n", xis[ans]);
}
}
}
return 0;
}
相關推薦
hdu5249---KPI(二分+樹狀陣列)
Problem Description 你工作以後, KPI 就是你的全部了. 我開發了一個服務,取得了很大的知名度。數十億的請求被推到一個大管道後同時服務從管頭拉取請求。讓我們來定義每個請求都有一個重要值。我的KPI是由當前管道內請求的重要值的中間值來計算。
[BZOJ2527][POI2011]Meteors(整體二分+樹狀陣列)
Address 洛谷P3527 BZOJ2527 LOJ#2169 Solution 容易想到對於每個詢問二分答案,但一次判定是 O (
Educational Codeforces Round 53 (Rated for Div. 2) D. Berland Fair 二分+樹狀陣列 O(n*logn*logn) 思路
題意: 給定n個店鋪,每個店鋪買的東西有個價格a_i,數量有無限個,然後主人公從1號開始走到n號,每走到一個店鋪,只要他的錢大於價格,他就要買,然後重複上述過程,直到他不能購買,輸出他能買的物品件數; 思路: 直接模擬的話,必然不可行,但是我們知道模擬時到達一個位置後買不起這裡的東西
HDU - 5493 Queue(二分+樹狀陣列)
題目連結:傳送門 題意:給你n個人,知道每個人的身高和每個人的前面或者後面有多少個比他高的,讓你輸出字典序最小的可能的排序。 思路:我們可以將人按身高升序順序,然後模擬插空,因為這樣我們就能保證之後插入的人有位置可插,只要注意每次我們可以判斷需要插入的空位
CodeForces992E 二分 + 樹狀陣列(線段樹)
http://codeforces.com/problemset/problem/992/E 題意:給定一個序列 ai ,記其字首和序列為 si ,有 q 個詢問,每次單點修改,詢問是否存在一個 i 滿足 
luogu3242 接水果 (整體二分+樹狀陣列)
考慮整體二分,問題就變成了每個(水果)路徑有多少個滿足條件(權值)的(盤子)子路徑 考慮一個盤子(a,b)表示兩端點(不妨設dfn[a]<dfn[b]),那麼他能接到的水果(u,v)一定滿足(不妨設dfn[u]<dfn[v]): 1.如果a是b的祖先,則u在(a的在(b,a)鏈上的孩子)這個子
2182 二分 + 樹狀陣列
Code: #include<cstdio> #include<stack> #include<cstring> #include<algorithm> using namespace std; const int
bzoj2527 [Poi2011]Meteors 整體二分+樹狀陣列
Description Byteotian Interstellar Union有N個成員國。現在它發現了一顆新的星球,這顆星球的軌道被分為M份(第M份和第1份相鄰),第i份上有第Ai個國家的太空站。
Educational Codeforces Round 53 (Rated for Div. 2) D. Berland Fair 二分+樹狀陣列 O(n*logn*logn) 思路
題意: 給定n個店鋪,每個店鋪買的東西有個價格a_i,數量有無限個,然後主人公從1號開始走到n號,每走到一個店鋪,只要他的錢大於價格,他就要買,然後重複上述過程,直到他不能購買,輸出他能買的物品件數; 思路: 直接模擬的話,必然不可行,但是我們知道模擬時到達一個位置後買
Codeforces 1070C Cloud Computing 二分 + 樹狀陣列 + 掃描線
Codeforces 1070C Cloud Computing 將左右端點分配到1-n上的各個點,然後從1-n 進行掃描線處理,維護兩個數狀陣列,c[i]
Codeforces846D(二分+樹狀陣列)
題意:每次對矩陣進行更新,有一個時刻。然後問什麼時候使得矩陣中有k * k的矩陣被更新了。 思路:二分時間,然後判斷每一個時間是否複合,注意這裡的時間不一定是連續的,所以需要離散化。每次判斷的時候需要對進行重新操作,判斷是否符合,用到了二維樹狀陣列。 #include
BZOJ 2527 [POI2011]MET-Meteors (整體二分+樹狀陣列)
題目大意:略 洛谷傳送門 整體二分裸題 考慮只有一個國家的情況如何處理 對詢問數量二分答案,暴力$O(m)$打差分,求字首和驗證,時間是$O(mlogK)$ 如果有$n$個國家,就是$O(nmlogK)$,非常不優秀的時間複雜度 發現我們對於每個國家都進行一次二分很浪費時間 考慮把國家分成一定數
BZOJ 1901 Dynamic Rankings (整體二分+樹狀陣列)
題目大意:略 洛谷傳送門 這道題在洛谷上資料比較強 貌似這個題比較常見的寫法是樹狀陣列套主席樹,動態修改 我寫的是整體二分 一開始的序列全都視為插入 對於修改操作,把它拆分成插入和刪除兩個操作 像$CDQ$分治一樣,用結構體記錄操作的位置,修改的權值等 假設為需要處理的詢問分配了一個答
ZOJ 3279 Ants 二分樹狀陣列
---------- const int maxn=110000; const int maxm=10000; int n,m; struct BIT{ int n; int tree[maxn]; void init(int n){
1017(二分+樹狀陣列)
Problem Description N (2 <= N <= 8,000) cows have unique brands in the range 1..N. In a spectacular display of poor judgment, they
bzoj千題計劃316:bzoj3173: [Tjoi2013]最長上升子序列(二分+樹狀陣列)
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; #define N 100001 #define lowbit(x) x&-x
求逆序 二分+樹狀陣列
#include<iostream> #include<stdio.h> using namespace std; int a[100001],n,temp[100001]; long long ct=0; void merg(int first,in
ZOJ 3635 Cinema in Akiba(二分+樹狀陣列)
題意:n個人輪流做到座位上, 第i個人做到第a[i]個空座上, 求最終每個人的座位情況。 思路:經典水題, 二分套樹狀陣列。 細節參見程式碼: #include<cstdio> #inc
poj2104 K-th Number(整體二分+樹狀陣列)
DescriptionYou are working for Macrohard company in data structures department. After failing your previous task about key insertio
[整體二分 樹狀陣列套線段樹] BZOJ 2674 Attack
大暴力啊 96s+卡過 //本地明明44s+ //要了資料才知道相對頂點可以不是左下和右上 #include<cstdio> #include<cstdlib> #include<algorithm> using namespace