1. 程式人生 > >hdu5249---KPI(二分+樹狀陣列)

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