分析:暴力会超时,这题有两种解法,分别为分块思想和树状数组。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <stack>
#include <map>
#include <queue>
#include <algorithm>
#define MAX 999999999
using namespace std;
int n,m,k;
int table[100001];
int block[317];
int main()
{
stack<int>s;
cin>>n;
while(n--)
{
string order;
cin>>order;
if(order == "Push")
{
int x;
cin>>x;
s.push(x);
table[x] ++;
block[x / 316] ++;
}
if(order == "Pop")
{
if(s.size() == 0)
cout<<"Invalid\n";
else{
cout<<s.top()<<endl;
int x = s.top();
s.pop();
table[x] --;
block[x / 316] --;
}
}
if(order == "PeekMedian")
{
if(s.size() == 0)
cout<<"Invalid\n";
else{
int k = s.size();
if(k % 2 == 0)
k /= 2;
else
k = (k + 1) / 2;
int sum = 0;
int idx = 0;
while(sum + block[idx] < k)
sum += block[idx++];
int num = idx * 316;
while(sum + table[num] < k)
sum += table[num++];
cout<<num<<endl;
}
}
}
return 0;
}
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <stack>
#include <map>
#include <queue>
#include <algorithm>
#define MAX 999999999
using namespace std;
int n,m,k;
int c[100001];
int lowbit(int x)
{
return x&(-x);
}
int getSum(int x)
{
int sum = 0;
for(int i = x; i > 0;i -= lowbit(i))
sum += c[i];
return sum;
}
void update(int x, int v)
{
for(int i = x;i < 100001; i += lowbit(i))
c[i] += v;
}
int main()
{
stack<int>s;
cin>>n;
while(n--)
{
string order;
cin>>order;
if(order == "Push")
{
int x;
cin>>x;
s.push(x);
update(x, 1);
}
if(order == "Pop")
{
if(s.size() == 0)
cout<<"Invalid\n";
else{
update(s.top(), -1);
cout<<s.top()<<endl;
s.pop();
}
}
if(order == "PeekMedian")
{
if(s.size() == 0)
cout<<"Invalid\n";
else{
int k = (s.size() + 1) / 2;
int left = 1;
int right = 100001;
int mid ;
while(left < right)
{
mid = (left + right) / 2;
if(getSum(mid) >=k)
right = mid;
else
left = mid + 1;
}
cout<<left<<endl;;
}
}
}
return 0;
}