L3-002 堆栈 树状数组+二分答案
来源:互联网 发布:js继承 编辑:程序博客网 时间:2024/06/09 23:03
题目详情点击这里
思路:用std::stack来表示题目中说的栈,现在关键问题就是如何找到中位数。
可以用二分答案+树状数组的方法
由于每个元素最大不超过1e5,因此开一个大小为1e5的树状数组来存储不超过x的数有多少个
每次push一个元素,都把以它为下标的树状数组位置+1,pop就相当于-1
这样的话sum(x)的含义就是栈中不超过x的数有多少个。然后就可以用二分的方法把答案确定出来了。
因为中位数x肯定要满足sum(x) >= N/2 或者sum(x) >= (N+1)/2
以前太菜了,现在看这道题目,感觉不难
代码:
#include <iostream>#include <cstdio>#include <stack>using namespace std;const int MAX = 1e5;stack<int> stk;int bitree[MAX + 10];int N;inline int lowbit(int x){return x&(-x);}void add(int pos,int x){while(pos <= MAX){bitree[pos] += x;pos += lowbit(pos);}}int sum(int pos){int res = 0;while(pos > 0){res += bitree[pos];pos -= lowbit(pos);}return res;}bool check(int x,int size){if(N&2 == 0)return sum(x) >= size/2; else return sum(x) >= (size+1)/2;}int main(){scanf("%d",&N);char ops[20];for(int i = 0;i < N;i++){scanf("%s",ops);if(ops[1] == 'o'){if(stk.empty())puts("Invalid");else{int val = stk.top();stk.pop();add(val,-1);printf("%d\n",val);}}else if(ops[1] == 'u'){int val;scanf("%d",&val);stk.push(val);add(val,1);}else{if(stk.empty()){puts("Invalid");continue;}int l = 0,r = MAX;while(l < r){int m = (l+r)/2;if(check(m,stk.size()))r = m;elsel = m+1;}printf("%d\n",l);}}return 0; }
0 0
- L3-002 堆栈 树状数组+二分答案
- L3-002. 堆栈-PAT团体程序设计天梯赛GPLT(树状数组)
- Poj 2182-Lost Cows(Treap||树状数组+二分答案)
- 4418: [Shoi2013]扇形面积并|二分答案|树状数组
- PTA C4 L3-010 树状数组
- poj2892 树状数组+二分
- poj2182(二分+树状数组)
- hdu5493 树状数组+二分
- hdu5493Queue 树状数组+二分
- hdoj5493【树状数组+二分】
- HDU2852【树状数组+二分】
- Codeforces846D(二分+树状数组)
- CodeForces540E【树状数组+二分】
- 团体程序设计天梯赛L3-002 堆栈
- HDU 4417 Super Mario (树状数组+离线处理)(划分树+二分答案)
- BZOJ_P3048 [Usaco2013 Jan]Cow Lineup(二分答案+树状数组/单调队列)
- bzoj 4326: NOIP2015 运输计划 (二分答案+树链剖分+树状数组)
- HDU 2852 KiKi's K-Number [树状数组+二分答案]【数据结构】
- MySQL新建用户,授权,删除用户,修改密码
- 考研英语
- vim配置成简单的python IDE
- 美团2017春招-算法工程师笔试-在线编程-判断有向图有回路
- 删除链表中的重复结点-Java
- L3-002 堆栈 树状数组+二分答案
- Tomcat默认可以使用的内存为128MB,不够调大!
- UVa 11538(大白书105)象棋中的皇后(组合计数)
- Java设计模式
- 入门级dp2
- P1862
- SpringBoot+Mybatis整合报,service注入失败,dao注入失败,
- Qt学习笔记2—串口通信
- 【密码学】AES加密算法图解