题意:
输入一个正整数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 }