当前位置:网站首页>PAT (Advanced Level) Practice 1057 Stack
PAT (Advanced Level) Practice 1057 Stack
2022-07-01 06:28:00 【Keep--Silent】
List of articles
subject
Stack is one of the most fundamental data structures, which is based on the principle of Last In First Out (LIFO). The basic operations include Push (inserting an element onto the top position) and Pop (deleting the top element). Now you are supposed to implement a stack with an extra operation: PeekMedian -- return the median value of all the elements in the stack. With NNN elements, the median value is defined to be the (N/2)(N/2)(N/2)-th smallest element if NNN is even, or ((N+1)/2)((N+1)/2)((N+1)/2)-th if NNN is odd.
Input Specification:
Each input file contains one test case. For each case, the first line contains a positive integer NNN (≤105\le 10^5≤105). Then NNN lines follow, each contains a command in one of the following 3 formats:
Push key Pop PeekMedian
where key
is a positive integer no more than 10510^5105.
Output Specification:
For each Push
command, insert key
into the stack and output nothing. For each Pop
or PeekMedian
command, print in a line the corresponding returned value. If the command is invalid, print Invalid
instead.
Sample Input:
17 Pop PeekMedian Push 3 PeekMedian Push 2 PeekMedian Push 1 PeekMedian Pop Pop Push 5 Push 4 PeekMedian Pop Pop Pop Pop
Sample Output:
Invalid Invalid 3 2 2 1 2 4 4 5 3 Invalid
General description
Three operations :
- Insert x
- Delete x
- Query median
Their thinking
data size 1 0 5 10^5 105, So give up , So we need some specific structures , The complexity of the three operations that require a single insert and delete query must be less than n n n, So that the overall complexity does not exceed n 2 n^2 n2, So choose a tree array .
Insert and delete
const int Size = 1e5 + 10;
int vt[Size], n = Size - 5;;
int lb(int x) {
return x & (-x); }
void update(int x,int size) {
for (int i = x; i <= n; i+=lb(i)) {
vt[i]+=size;
}
}
- Insert x: update(x,1);
- Delete x: update(x,-1);
therefore :
- Insert x
- Delete x
- Query median
Query median
The tree array represents the prefix and , We use it vt Storage quantity , Two points search that will do : That is, we are looking for the median , I.e. find The first position equal to or greater than half of the quantity .
int getsum(int index) {
int cnt = 0;
for (int i = index; i; i -= lb(i))cnt += vt[i];
return cnt;
}
void Medeian() {
int cnt = getsum(n);
int pot = (cnt+1) / 2;
if (cnt== 0) {
printf("Invalid\n");
return;
}
int l = 1, r = n;
while (l < r) {
int mid = l + r >> 1;
if (getsum(mid) >= pot)r = mid;
else l = mid + 1;
}
printf("%d\n",l);
}
thus
- Insert x
- Delete x
- Query median
Complexity analysis
Dichotomous complexity log n \log n logn,getsum Complexity log n \log n logn, in total n n n operations , Overall complexity n log 2 n n \log^2 n nlog2n
Complete code
#include <bits/stdc++.h>
using namespace std;
const int Size = 1e5 + 10;
int vt[Size], n = Size - 5;;
int lb(int x) {
return x & (-x); }
void update(int x,int size) {
for (int i = x; i <= n; i+=lb(i)) {
vt[i]+=size;
}
}
int getsum(int index) {
int cnt = 0;
for (int i = index; i; i -= lb(i))cnt += vt[i];
return cnt;
}
void Medeian() {
int cnt = getsum(n);
int pot = (cnt+1) / 2;
if (cnt== 0) {
printf("Invalid\n");
return;
}
int l = 1, r = n;
while (l < r) {
int mid = l + r >> 1;
if (getsum(mid) >= pot)r = mid;
else l = mid + 1;
}
printf("%d\n",l);
}
int main() {
stack<int>sk;
int n,x;
cin >> n;
char ss[300];
while (n--) {
scanf("%s", &ss);
if (ss[1] == 'o') {
if (sk.size() == 0) {
printf("Invalid\n");
continue;
}
x = sk.top();
update(x, -1);
sk.pop();
printf("%d\n", x);
}
else if (ss[1] == 'u') {
scanf("%d", &x);
sk.push(x);
update(x, 1);
}
else {
Medeian();
}
}
return 0;
}
边栏推荐
- JMM details
- What are the functions of LAN monitoring software
- lxml模块(数据提取)
- High order binary balanced tree
- webapck打包原理--启动过程分析
- Free trial of self-developed software noisecreater1.1
- 数据库产生死锁了请问一下有没有解决办法
- [automatic operation and maintenance] what is the use of the automatic operation and maintenance platform
- 根据输入画有向图
- SQL statement
猜你喜欢
C language course design student information management system (big homework)
[ManageEngine] how to realize network automatic operation and maintenance
异常检测方法梳理,看这篇就够了!
To sort out the anomaly detection methods, just read this article!
How did ManageEngine Zhuohao achieve the goal of being selected into Gartner Magic Quadrant for four consecutive years?
Excel visualization
概率论学习笔记
SQL语句
【网络安全工具】USB控制软件有什么用
sci-hub如何使用
随机推荐
启牛学堂合作的证券公司是哪家?开户安全吗?
On siem
To sort out the anomaly detection methods, just read this article!
H5网页判断是否安装了某个APP,安装则跳转未安装则下载的方案总结
HCM Beginner (III) - quickly enter pa70 and pa71 to browse employee information PA10
第五章 输入/输出(I/O)管理
【网络安全工具】USB控制软件有什么用
What are the functions of LAN monitoring software
Record MySQL troubleshooting caused by disk sector damage
[network security tool] what is the use of USB control software
Embedded system
NOC 设计的一些坑
网络爬虫
[unity shader custom material panel part II]
高阶-二叉平衡树
[ManageEngine] terminal management system helps Huasheng securities' digital transformation
华福证券开户是安全可靠的么?怎么开华福证券账户
【#Unity Shader#自定义材质面板_第二篇】
ManageEngine卓豪助您符合ISO 20000标准(四)
C language course is provided with employee information management system (large operation)