【PAT甲级】1057 Stack (30 分)(分块)

题意:

输入一个正整数N(<=1e5),接着输入N行字符串,模拟栈的操作,非入栈操作时输出中位数。(总数为偶数时输入偏小的)

trick:

分块操作节约时间

AAAAAccepted code:

 1 #define HAVE_STRUCT_TIMESPEC
 2 #include<bits/stdc++.h>
 3 using namespace std;
 4 string s;
 5 stack<int>sk;
 6 int num[100007],block[1007];
 7 int main(){
 8     ios::sync_with_stdio(false);
 9     cin.tie(NULL);
10     cout.tie(NULL);
11     int n;
12     cin>>n;
13     int _size=sqrt(100005);
14     for(int i=1;i<=n;++i){
15         cin>>s;
16         if(s[1]=='u'){
17             int x;
18             cin>>x;
19             sk.push(x);
20             ++num[x];
21             ++block[x/_size];
22         }
23         else if(s[1]=='o')
24             if(sk.empty())
25                 cout<<"Invalid
";
26             else{
27                 int x=sk.top();
28                 sk.pop();
29                 cout<<x<<"
";
30                 --num[x];
31                 --block[x/_size];
32             }
33         else
34             if(sk.empty())
35                 cout<<"Invalid
";
36             else{
37                 int mid=sk.size()/2;
38                 if(sk.size()&1)
39                     ++mid;
40                 int sum=0;
41                 int k;
42                 for(k=0;k<=_size&&sum+block[k]<mid;++k)
43                     sum+=block[k];
44                 for(int j=k*_size;j<(k+1)*_size;++j){
45                     sum+=num[j];
46                     if(sum>=mid){
47                         cout<<j<<"
";
48                         break;
49                     }
50                 }
51             }
52     }
53     return 0;
54 }
保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
原文地址:https://www.cnblogs.com/ldudxy/p/11677846.html