MZL's simple problem
Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 595 Accepted Submission(s): 294
Problem Description
A simple problem
Problem Description
You have a multiple set,and now there are three kinds of operations:
1 x : add number x to set
2 : delete the minimum number (if the set is empty now,then ignore it)
3 : query the maximum number (if the set is empty now,the answer is 0)
Problem Description
You have a multiple set,and now there are three kinds of operations:
1 x : add number x to set
2 : delete the minimum number (if the set is empty now,then ignore it)
3 : query the maximum number (if the set is empty now,the answer is 0)
Input
The first line contains a number
N
(
N≤106
),representing the number of operations.
Next N line ,each line contains one or two numbers,describe one operation.
The number in this set is not greater than 109 .
Next N line ,each line contains one or two numbers,describe one operation.
The number in this set is not greater than 109 .
Output
For each operation 3,output a line representing the answer.
Sample Input
6 1 2 1 3 3 1 3 1 4 3
Sample Output
3 4
Source
题意:n个查询,每个查询首先是一个K确定操作,K=1表示向数组插入一个X(X在K后面输入),K=2表示删除数组中最小值,K=3表示查询数组中的最大值
PS:这里的操作只需要记录最大值和数组中元素的个数,删除操作就是元素个数减一,插入操作就是元素个数加一同时与最大值比较然后记录更大值
PS:有一点很重要,就是当删除完毕之后,最大值要初始化,不然下次插入又会把先前的拿来比较~~
、、、当然,比赛时我第一眼想到的竟然是线段树~
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define Max(a,b) (a>b?a:b) #define Min(a,b) (a<b?a:b) #define LL long long using namespace std; int main() { LL t,n,m,i,j,k,l,num,Nmax; while(scanf("%lld",&n)!=EOF) { num=0; Nmax=-9999999999; while(n--&&scanf("%lld",&k)) { if(k==3) { if(num>0)printf("%lld\n",Nmax); else puts("0"); } else if(k==1) { scanf("%lld",&l); num++; Nmax=Max(Nmax,l);//记录更大值 }else { if(num>0)num--; if(num==0)Nmax=-9999999999;//初始化最大值 } } } return 0; }