HDU-Yuna's confusion 树状数组 Or Multiset
比赛的时候竟然没有想到这题可以用树状数组过,由于数字的区间比较小,所以直接开设一个树状数组,定义sum(i) 表示小于i的数的总数。那么判定一个数是否有的条件就是计算sum(i+1) == sum(i) 便可以了,查找第K大的数,也就可以直接二分了。
代码如下:
#include <cstdlib> #include <cstring> #include <cstdio> #include <algorithm> #define MAXN 100000 using namespace std;int c[MAXN+5];int lowbit(int x) {return x & -x; }void modify(int x, int val) {for (int i = x; i <= MAXN; i += lowbit(i)) {c[i] += val;} }int sum(int x) {int ret = 0;for (int i = x; i > 0; i -= lowbit(i)) {ret += c[i];}return ret; }int bsearch(int l, int r, int k) {int mid, ret = -1;while (l <= r) {mid = (l + r) >> 1;// printf("mid = %d, sum() = %d\n", mid, sum(mid));// getchar();if (sum(mid) >= k) {ret = mid;r = mid - 1; }else {l = mid + 1; }}return ret; }int main() {int M, x, y, ret;char op[5];while (scanf("%d", &M) == 1) {memset(c, 0, sizeof (c));for (int i = 1; i <= M; ++i) {scanf("%s", op);if (op[0] == 'A') {scanf("%d", &x);modify(x, 1); }else if (op[0] == 'D'){scanf("%d", &x);// printf("%d %d\n", sum(x), sum(x-1));if (sum(x) == sum(x-1)) {puts("No Elment!");}else {modify(x, -1);}}else { // query通过二分查找来对付 scanf("%d %d", &x, &y);y += sum(x);ret = bsearch(x+1, MAXN, y);if (ret == -1) {puts("Not Find!");}else {printf("%d\n", ret);}}} }return 0; }
还有一种做法,就是直接用STL中的multiset.
代码如下:
#include<iostream> #include<algorithm> #include<set> using namespace std;multiset<int> s; multiset<int>::iterator it;int main(){int Q;while( ~scanf("%d",&Q)){s.clear();char ope[10];int x,k;for(int i = 1; i <= Q; i++){scanf("%s", ope);if( ope[0] == 'A' ){scanf("%d",&x);s.insert(x); }else if( ope[0] == 'D' ){scanf("%d",&x);int cnt = s.count(x);if( cnt == 0 ){puts("No Elment!");continue; }s.erase(x);for(int i = 1; i <= cnt-1; i++)s.insert(x); }else {scanf("%d%d",&x,&k);it = s.upper_bound(x);if( it == s.end() ){//|| (it+(k-1) >= s.end() ) ){puts("Not Find!");continue;} int i=1;for(; it != s.end() && i < k; i++, it++); if( it == s.end() ){puts("Not Find!");continue;}printf("%d\n", *(it) );}} } }
转载于:https://www.cnblogs.com/Lyush/archive/2012/08/12/2635387.html
HDU-Yuna's confusion 树状数组 Or Multiset相关推荐
- HDU ACM 4031 Attack (树状数组--单点查询+区间更新)
http://acm.hdu.edu.cn/showproblem.php?pid=4031 用了树状数组的区间更新 单点查找(一般为单点更新 区间查找) 例如 区间(2,4)加1 则Updata(2 ...
- hdu 4125 Moles(kmp+树状数组)
题目链接:hdu 4125 Moles 题意: 给你n个数,让你按键值建一个平衡二叉树,然后奇数为0,偶数为1,然后可以遍历这颗树得到一个欧拉序列,现在给你一个串,问你出现了几次. 题解: 建树的时候 ...
- hdu 1892二维树状数组
这题我知道是用树状数组,可是好久没打树状数组了,就想用普通方法水过去~~结果--结果--水了好多方法都水不过,出题人真狠呐--我的水方法是对于每一次查询,初始化ans=(x2-x1+1)*(y2-y1 ...
- hdu 4417 Super Mario 树状数组||主席树
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Prob ...
- HDU 1556 前缀和 树状数组 线段树
解法一: a[i]表示以 i作为起点,对 i-n的气球全部上色的次数 对(start,end)区间上色 ++a[start] --a[end+1]抵消掉 end+1-n的部分 问题转换为求 a的前缀 ...
- HDU - 5775 Bubble Sort(树状数组)
题目链接:点击查看 题目大意:给出n个数,求出按照冒泡排序期间每个数可以到达的最右边位置和最左边位置的差 题目分析:其实这个题想明白了就很简单了,先用辅助数组a按照顺序存储每一个数,a[i]就代表排序 ...
- HDU 4777 Rabbit Kingdom 树状数组
分析:找到每一个点的左边离他最近的不互质数,记录下标(L数组),右边一样如此(R数组),预处理 这个过程需要分解质因数O(n*sqrt(n)) 然后离线,按照区间右端点排序 然后扫一遍,对于当前拍好顺 ...
- hdu 4267 多维树状数组
题意:有一个序列 "1 a b k c" means adding c to each of Ai which satisfies a <= i <= b and (i ...
- HDU 2689 POJ 2299 树状数组 + 离散化
以前都是直接树状数组裸奔,昨天一个题数据量好大,过不了,没办法只能学离散化,今天A了第一个离散化的题 #include<stdio.h> #include<string.h> ...
最新文章
- pytorch attention
- Leetcode 211. 添加与搜索单词 - 数据结构设计 解题思路及C++实现
- 限流10万QPS、跨域、过滤器、令牌桶算法-网关Gateway内容都在这儿
- c++ 连续图片显示_计算整数的和并显示结果
- Linux禁止非WHEEL用户使用SU命令
- SQLServer UPDATE INNER JOIN、DELETE INNER JOIN
- JAVA入门级教学之(多态)
- Ubuntu14.04 VSCode工程在root下无运行,在非root无法修改配置文件
- Android 动画 Animator 家族
- 关于学习Swift的一些感受
- [导入]基于D3D Effect的引擎模式探讨。
- 计算机系统运维服务方案,xx局信息化系统运维服务方案+标准版.doc
- 达梦数据库DM8企业版--命令行方式的安装、创建数据库和注册服务
- 误将系统装入D盘 原来数据如何恢复
- NLPIR汉语分词(Java调用 使用IDEA )
- Linux TCP之sack(二)
- Mysql数据库的安装--三分钟搞定
- 解密微信小程序加密的微信运动数据(java)
- linux中如果编译二进制,在linux中把汇编或c程序交叉编译成二进制文件烧录开发板过程详解...
- 使用 ERD Online元数据管理平台,轻松创建和共享企业元数据