题目https://pintia.cn/problem-sets/994805342720868352/problems/994805417945710592

题意:对一个栈进行push, pop和找中位数三种操作。

思路:

好久没写题。感觉傻逼题写多了稍微有点数据结构的都不会写了。

pop和push操作就不说了。

找中位数的话就二分去找某一个数前面一共有多少小于他的数,找到那个小于他的数刚好等于一半的。

找的过程中要用到前缀和,所以自然而然就应该上树状数组。

要注意树状数组的界应该是1e5而不是当前数的最大值。

 //#include<bits/stdc++>
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<stdlib.h>
#include<queue>
#include<map>
#include<stack>
#include<set> #define LL long long
#define ull unsigned long long
#define inf 0x7f7f7f7f using namespace std;
const int maxn = 1e5 + ;
int n, size;
int sum[maxn];
stack<int>sss;
int small = , big = 1e5; void add(int x, int val)
{
while(x < 1e5){
sum[x] += val;
x += (x & -x);
}
} int query(int x)
{
int ans = ;
while(x){
ans += sum[x];
x -= (x & -x);
}
return ans;
} int main()
{
scanf("%d", &n); while(n--){
string op;
cin>>op;
if(op == "Push"){
int key;
cin>>key;
sss.push(key);
//small = min(small, key);
//big = max(big, key);
add(key, );
}
else if(op == "Pop"){
if(sss.size() == ){
printf("Invalid\n");
}
else{
add(sss.top(), -);
printf("%d\n", sss.top());
sss.pop();
}
}
else if(op == "PeekMedian"){
if(sss.size() == ){
printf("Invalid\n");
}
else{
int st = small, ed = big;
int ans = ;
while(st <= ed){
int mid = (st + ed) / ;
size = sss.size();
int res = query(mid);
if(res < (size + ) / ){
st = mid + ;
}
else{
ans = mid;
ed = mid - ;
}
}
printf("%d\n", ans);
}
}
} return ;
}

PAT甲级1057 Stack【树状数组】【二分】的更多相关文章

  1. 1057 Stack 树状数组

    Stack is one of the most fundamental data structures, which is based on the principle of Last In Fir ...

  2. PAT甲级1057. Stack

    PAT甲级1057. Stack 题意: 堆栈是最基础的数据结构之一,它基于"先进先出"(LIFO)的原理.基本操作包括Push(将元素插入顶部位置)和Pop(删除顶部元素).现在 ...

  3. 树状数组+二分||线段树 HDOJ 5493 Queue

    题目传送门 题意:已知每个人的独一无二的身高以及排在他前面或者后面比他高的人数,问身高字典序最小的排法 分析:首先对身高从矮到高排序,那么可以知道每个人有多少人的身高比他高,那么取较小值(k[i], ...

  4. 牛客多校第3场 J 思维+树状数组+二分

    牛客多校第3场 J 思维+树状数组+二分 传送门:https://ac.nowcoder.com/acm/contest/883/J 题意: 给你q个询问,和一个队列容量f 询问有两种操作: 0.访问 ...

  5. POJ 2828 Buy Tickets (线段树 or 树状数组+二分)

    题目链接:http://poj.org/problem?id=2828 题意就是给你n个人,然后每个人按顺序插队,问你最终的顺序是怎么样的. 反过来做就很容易了,从最后一个人开始推,最后一个人位置很容 ...

  6. TZOJ 4602 高桥和低桥(二分或树状数组+二分)

    描述 有个脑筋急转弯是这样的:有距离很近的一高一低两座桥,两次洪水之后高桥被淹了两次,低桥却只被淹了一次,为什么?答案是:因为低桥太低了,第一次洪水退去之后水位依然在低桥之上,所以不算“淹了两次”.举 ...

  7. POJ 2182 Lost Cows 【树状数组+二分】

    题目链接:http://poj.org/problem?id=2182 Lost Cows Time Limit: 1000MS   Memory Limit: 65536K Total Submis ...

  8. P2161 [SHOI2009]会场预约[线段树/树状数组+二分/STL]

    题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...

  9. The Stream of Corning 2( 权值线段树/(树状数组+二分) )

    题意: 有两种操作:1.在[l,r]上插入一条值为val的线段 2.问p位置上值第k小的线段的值(是否存在) 特别的,询问的时候l和p合起来是一个递增序列 1<=l,r<=1e9:1< ...

随机推荐

  1. ionic BUILD FAILED

    BUILD FAILED Total time: 24.572 secs FAILURE: Build failed with an exception. What went wrong: Execu ...

  2. c# System.Threading.Thread

    using System; using System.Threading; // Simple threading scenario: Start a static method running // ...

  3. 人人网框架导入uidGenerator的ID生成方式

    人人网框架导入uidGenerator的ID生成方式 2019-03-11 LIUREN    SpringBoot2.0  uidGenerator  SpringBoot2.0  uidGener ...

  4. C++ 无锁数据结构

    https://www.zhihu.com/question/52629893/answer/131731126

  5. APP开发的基本流程

    一个独立App开发人的自白:做APP就是一场赌局,你要会押注 下面我们就直接来看下APP从业者必知的整个APP开发标准流程. 一般的APP开发及上线流程 步骤如下: 首先,制作一款APP,必须要有相关 ...

  6. C# 中字符串转换成日期

    我们在处理字符串日期格式常用DateTime.Pares() 但是这个形式的转换是相当有限的,有些C#是会不懂你写入的日期格式的如20031231.那么类似 "20100101" ...

  7. 生产环境CPU过高问题定位

    问题描述:       生产环境下的某台tomcat7服务器,在刚发布时的时候一切都很正常,在运行一段时间后就出现CPU占用很高的问题,基本上是负载一天比一天高. 解决过程: 1.根据top命令,发现 ...

  8. hive hbase区别

    1.hive是sql语言,通过数据库的方式来操作hdfs文件系统,为了简化编程,底层计算方式为mapreduce. 2.hive是面向行存储的数据库. 3.Hive本身不存储和计算数据,它完全依赖于H ...

  9. aspx页面,取得Excel某列不同类型的数据为空

    红色部分需要加上, string connectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source ...

  10. d3绘制饼状图

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...