PAT1057.Stack (30)
来源:互联网 发布:住宅设计优化 编辑:程序博客网 时间:2024/05/23 12:00
题目地址:http://pat.zju.edu.cn/contests/pat-a-practise/1057
这题为浙大2013年考研复试上机的最后一题,分数值为30分,大部分人开始都会出现有几个case超时的状况,可能源于频繁的在PeekMedian操作时进行排序,导致了超时。
利用树状数组,辅之以普通的二分法,可以在限定的100ms内得到结果。树状数组的介绍
//#include"stdafx.h"#include<stdio.h>#include<cstring>#include<iostream>#include<string>using namespace std;const int N=100005;int c[N];int lowbit(int i){return i&(-i);}void add(int pos,int value){while(pos<N){c[pos]+=value;pos+=lowbit(pos);}}int sum(int pos){int res=0;while(pos>0){res+=c[pos];pos-=lowbit(pos);}return res;}int find(int value){int l=0,r=N-1,median,res;while(l<r-1){if((l+r)%2==0)median=(l+r)/2;elsemedian=(l+r-1)/2;res=sum(median);if(res<value)l=median;else r=median;}return l+1;}int main(){//freopen("D://test.txt","r",stdin);char ss[20];int stack[N],top=0,n,pos;memset(c,0,sizeof(c));scanf("%d",&n);while(n--){scanf("%s",ss);if(ss[1]=='u'){scanf("%d",&pos);stack[++top]=pos;add(pos,1);}else if(ss[1]=='o'){if(top==0){printf("Invalid\n");continue;}int out=stack[top];add(out,-1);printf("%d\n",stack[top--]);}else if(ss[1]=='e'){if(top==0){printf("Invalid\n");continue;}int res;if(top%2==0)res=find(top/2);elseres=find((top+1)/2);printf("%d\n",res);}else{printf("Invalid\n");}}return 0;}
- PAT1057.Stack (30)
- pat1057 stack 分块的做法
- PAT1057
- PAT1057. 数零壹
- PAT1057. 数零壹(20)
- 用python实现PAT1057数零壹
- Stack (30)
- PAT 1057 Stack (30)
- 1057. Stack (30)-PAT
- 1057. Stack (30)
- 1057. Stack (30)
- 1057. Stack (30)
- 1057. Stack (30)
- pat 1057. Stack (30)
- 1057. Stack (30)--看
- 1057. Stack (30)
- PAT 1057. Stack (30)
- 1057. Stack (30)
- CentOS开机自动运行程序的脚本
- 黑马程序员_集合类
- 基本的排序算法原理与实现
- 移植最新uboot之:支持NANDFLASH启动
- Spring HTTP Remote Invoker的一个问题
- PAT1057.Stack (30)
- myeclipse 添加XSD或者DTD文件
- linux shell command
- IOS开发(27)之UITableView的Cell显示长按快捷菜单
- mongodb清理collection中大量数据的2种办法
- java泛型
- 在360浏览器下使用ajax无效的一点案例
- 1504: ZZ的橱柜
- flex 常用元标签讲解