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

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

1057. Stack (30)

2019-11-10 21:50:33
字體:
供稿:網(wǎng)友

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

2. 思路:

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

3. 源碼(已AC):

#include<iostream>#include<stack>#include<vector>#include<set>#include<functional>//使用仿函數(shù)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));//刪除不能用值做參數(shù),會刪除多個。				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;}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 弥勒县| 安徽省| 扎囊县| 浏阳市| 乌拉特中旗| 屯昌县| 乌兰浩特市| 安福县| 海宁市| 泰来县| 岳普湖县| 定安县| 大余县| 江源县| 富平县| 安化县| 廊坊市| 施秉县| 天长市| 大荔县| 永清县| 建德市| 郸城县| 康定县| 岫岩| 新民市| 武义县| 临沭县| 邵东县| 武鸣县| 盈江县| 洛浦县| 尖扎县| 华宁县| 宜兰市| 田东县| 新沂市| 万山特区| 台州市| 岳阳市| 新竹市|