国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

1057. Stack (30)

2019-11-10 19:10:49
字體:
來源:轉載
供稿:網友

1. 原題: https://www.patest.cn/contests/pat-a-PRactise/1057

2. 思路:

題意:題目關鍵是求棧的中位數。思路:一般方法會超時。必須是O(1)或者O(log)求中位數才不會。可以用樹狀數組,或者用集合模擬大小堆。我用的是集合(multiset).一個small(小根堆),保存后一半。big(大根堆),保存前一半元素。大根堆與小根堆的元素個數相等(偶數),或者多1個(奇數),這樣大根堆堆頂即是中位數。已AC。部分參考自:http://blog.csdn.net/kakitgogogo/article/details/51926600

3. 源碼(已AC):

#include<iostream>#include<stack>#include<vector>#include<set>#include<functional>//使用仿函數greater<int>using namespace std;int main(void){	//freopen("in.txt", "r", stdin);	int N;	char s[15];	stack<int> st;	multiset<int> small;//小根堆	multiset<int, greater<int> > big;//大根堆	scanf("%d", &N);	for (int i = 0; i < N; i++)	{		scanf("%s", s);		if (s[1] == 'o')		{			if (st.empty())				printf("Invalid/n");			else			{				int num = st.top();				printf("%d/n", num);				if (num > *big.begin())					small.erase(small.find(num));//刪除不能用值做參數,會刪除多個。				else					big.erase(big.find(num));				st.pop();			}		}		else if (s[1] == 'u')		{			int num;			scanf("%d", &num);			st.push(num);			if (!big.empty() && num > *big.begin())				small.insert(num);			else				big.insert(num);		}		else		{			if (big.empty())				printf("Invalid/n");			else				printf("%d/n", *big.begin());		}		if (small.size() > big.size())//對兩個堆進行維護,確保符合要求。		{			big.insert(*small.begin());			small.erase(small.begin());		}		else if (big.size() > small.size() + 1)		{			small.insert(*big.begin());			big.erase(big.begin());		}	}	return 0;}
上一篇:poj1528

下一篇:互斥鎖mutex的使用方法

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 闽清县| 巧家县| 威远县| 汪清县| 安吉县| 台湾省| 柳林县| 永春县| 永平县| 公安县| 宾川县| 道孚县| 民乐县| 镇安县| 青川县| 思南县| 友谊县| 阿拉尔市| 凤凰县| 澎湖县| 虎林市| 禄丰县| 康马县| 海淀区| 佳木斯市| 平顺县| 栾城县| 和硕县| 阿克| 漠河县| 子洲县| 祁东县| 内乡县| 阳高县| 余庆县| 华宁县| 巴马| 琼结县| 晋州市| 加查县| 威海市|