日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

hdu5249KPI动态中位数(两个set)

發(fā)布時間:2025/6/17 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu5249KPI动态中位数(两个set) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題意(中問題直接粘題意吧)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? KPI


Problem Description
你工作以后, KPI 就是你的全部了. 我開發(fā)了一個服務,取得了很大的知名度。數(shù)十億的請求被推到一個大管道后同時服務從管頭拉取請求。讓我們來定義每個請求都有一個重要值。我的KPI是由當前管道內請求的重要值的中間值來計算。現(xiàn)在給你服務記錄,有時我想知道當前管道內請求的重要值得中間值。
?
Input
有大約100組數(shù)據(jù)。


每組數(shù)據(jù)第一行有一個n(1≤n≤10000),代表服務記錄數(shù)。


接下來有n行,每一行有3種形式
? "in x": 代表重要值為x(0≤x≤109)的請求被推進管道。
? "out": 代表服務拉取了管道頭部的請求。
? "query: 代表我想知道當前管道內請求重要值的中間值. 那就是說,如果當前管道內有m條請求, 我想知道,升序排序后第floor(m/2)+1th 條請求的重要值.


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


Output
對于每組數(shù)據(jù),先輸出一行


Case #i:
然后每一次"query",輸出當前管道內重要值的中間值。



Sample Input
6
in 874
query
out
in 24622
in 12194
query


Sample Output
Case #1:
874
24622


思路:

? ? ? 題意要求動態(tài)的求中位數(shù),我的方法是開兩個優(yōu)先隊列,然后左邊升序,右邊降序,右邊個數(shù)-左邊個數(shù)>=1,然后右邊詢問的時候直接輸出右邊最小的,刪除的時候就直接mark上(不是馬上從隊列里面拿出來),然后看看是左邊還是右邊的,把對應的那邊的個數(shù)-1,如果發(fā)現(xiàn)(右邊個數(shù)-左邊個數(shù)>=1)這個條件不滿足了,那么就權衡下,兩個隊列里面的元素處理下(左給右或者右給左),總的時間復雜度與數(shù)據(jù)無關,是O(n*log(n))的。


#include<stack> #include<map> #include<queue> #include<stdio.h> #include<string.h>using namespace std;typedef struct L {int x;friend bool operator < (L a ,L b){return a.x < b.x;} }L;typedef struct R {int x;friend bool operator < (R a ,R b){return a.x > b.x;} }R;R xinr ,tour; L xinl ,toul; priority_queue<L>lq; priority_queue<R>rq; queue<int>qq; map<int ,int>mark;int main () {int n ,cas = 1 ,i ,a;char str[10];while(~scanf("%d" ,&n)){while(!lq.empty())lq.pop();while(!rq.empty())rq.pop();while(!qq.empty())qq.pop();mark.clear();int ls = 0 ,rs = 0;printf("Case #%d:\n" ,cas ++);while(n--){scanf("%s" ,str);if(str[0] == 'i'){scanf("%d" ,&a);mark[a] = 1;qq.push(a);if(ls == rs)//往右放{rs ++;if(ls == 0){xinr.x = a;rq.push(xinr);}else{toul = lq.top();xinr.x = a;if(toul.x < a) rq.push(xinr);else{lq.pop();tour.x=toul.x;rq.push(tour);xinl.x=xinr.x;lq.push(xinl);}}}else //往左放{ls ++;tour = rq.top();xinl.x = a;if(tour.x > a) lq.push(xinl);else{rq.pop();toul.x=tour.x;lq.push(toul);xinr.x=xinl.x;rq.push(xinr);}}}if(str[0] == 'o'){int tou = qq.front();qq.pop();if(tou >= rq.top().x) rs --;else ls --;mark[tou] = 0;if(ls > rs) //->{ls -- ,rs ++;xinr.x = lq.top().x;lq.pop();rq.push(xinr);}if(rs - ls == 2){ls ++ ,rs --;xinl.x = rq.top().x;rq.pop();lq.push(xinl);}}if(str[0] == 'q'){printf("%d\n" ,rq.top().x);}while(!lq.empty()){if(!mark[lq.top().x])lq.pop();else break;}while(!rq.empty()){if(!mark[rq.top().x])rq.pop();else break;}}} }

總結

以上是生活随笔為你收集整理的hdu5249KPI动态中位数(两个set)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。