操作序列(STL)

時間限制:C/C++ 5秒,其他語言10秒
空間限制:C/C++ 131072K,其他語言262144K
64bit IO Format: %lld
題目描述
給出一個長度無限的數列,初始全部爲零,有三種操作:

增加操作:給下標爲 tt 的數加 cc 。特別注意,如果在下標 [t-30,t+30][t−30,t+30] 內有不爲零的數,增加操作無效。
削減操作:讓數列中下標最小的不爲零數變爲零。
查詢操作:查詢數列中下標爲 tt 的數字是多少。

輸入描述:
第一行包含一個整數 N,1≤N≤10 ^6,表示操作總數。
隨後 N 行,每行由兩個數字或一個數字組成。
若一行中有兩個數字,分別代表增加操作的 t,c 。
若一行中只有數字-1,執行削減操作。
若一行中只有一個不爲 -1的數字,則代表查詢操作的數字 t。
保證t,c均爲非負整數且在整形範圍內。

輸出描述:
削減操作時,先輸出該數字,再變爲零
若序列元素全爲零,則削減操作無效,此時輸出 “skipped”
查詢時,輸出該位置上的數

示例1
輸入

7
140 1
120 2
100 3
120
100
-1
100
輸出
0
3
3
0

示例2
輸入

4
140 3
-1
140 1
-1
輸出
3
1

示例3
輸入

3
-1
-1
-1
輸出
skipped
skipped
skipped

#include<cstdio>
#include<map>
#include<algorithm>
#include<cstring>
using namespace std;
map<int,int>s;//第一個存小標,第二個存數
int main()
{
	int N,c,t;
	scanf("%d",&N);
	for(int i=0;i<N;i++)
	{
		scanf("%d",&t);
		if(getchar()=='\n')
		{
			if(t==-1)//消減操作 
			{
				if(s.empty())puts("skipped");//序列元素全爲零 
				else
				{
					printf("%d\n",s.begin()->second);
					s.erase(s.begin());//變爲零即是刪除 
				}
			}
			else//查詢操作 
			{
				if(s.count(t))
			    printf("%d\n",s[t]);
				else
				puts("0");  
			
		    }
		}
		else//增加操作 
		{
			scanf("%d",&c);
			int flag=0;
			map<int,int>::iterator it;
			it=s.lower_bound(t-30);
			if(it==s.end()||it->first>t+30)
			s[t]+=c;
		} 
		
	}
} 

注意:本題的判斷輸入個數的方法值得借鑑,直接判斷鍵盤getcga()是輸入空格還是回車即可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章