1057.Stack (30)...to be continued...

本文介绍了一种利用栈和分块查找技术实现的数据结构,该结构能够高效地处理Push、Pop操作,并能快速找到中位数。通过将数据分块存储并维护每块及每个元素的计数,可以在O(1)时间内完成Push和Pop操作,同时在O(logN)时间内找到当前栈的中位数值。

1057.Stack (30)…to be continued…

pat-al-1057

2017-02-27

  • 分块查找的思想
/**
 * pat-al-1057
 * 2017-02-27
 * Cpp version
 * Author: fengLian_s
 */
#include<stdio.h>
#include<stack>
#include<string.h>
#define MAX 100010
#define sqrN 316
using namespace std;
stack<int> st;
int block[sqrN];
int table[MAX];
void Push(int num)
{
  st.push(num);
  table[num]++;
  block[num/sqrN]++;
}
void Pop()
{
  int num = st.top();
  st.pop();
  table[num]--;
  block[num/sqrN]--;
  printf("%d\n", num);
}
void peekMedian(int k)
{
  int sum = 0, index = 0;
  while(sum + block[index] < k)
  {
    sum += block[index++];
  }
  int num = index * sqrN;
  while(sum + table[num] < k)
  {
    sum += table[num++];
  }
  printf("%d\n", num);
}
int main()
{
  memset(block, 0, sizeof(block));
  memset(table, 0, sizeof(table));
  freopen("in.txt", "r", stdin);
  int n;
  scanf("%d", &n);
  char cmd[20];
  int num;
  for(int i = 0;i < n;i++)
  {
    scanf("%s", cmd);
    if(strcmp(cmd, "Push") == 0)
    {
      scanf("%d", &num);
      Push(num);
    }
    else if(strcmp(cmd, "Pop") == 0)
    {
      if(st.empty())
        printf("Invalid\n");
      else
        Pop();
    }
    else//peekMedian
    {
      if(st.empty())
        printf("Invalid\n");
      else
      {
        int k = (st.size() + 1) / 2;
        peekMedian(k);
      }
    }
  }
  return 0;
}

-TBC-

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值