权值树状数组 HDU-2852 KiKi's K-Number
引入
权值树状数组就是数组下标是数值的数组,数组存储下标对应的值有几个数
题目 HDU-2852 KiKi's K-Number
题意
几种操作,p=0代表push:将数值为a的数压入盒子
p=1代表pop,代表删除数值为e的数,如果没有这个数,输出No Elment!
p=2代表query,查询比第k个比a大的元素,找不到输出Not Find!
Sample Input
5
0 5
1 2
0 6
2 3 2
2 8 1
7
0 2
0 2
0 4
2 1 1
2 1 2
2 1 3
2 1 4
Sample Output
No Elment!
6
Not Find!
2
2
4
Not Find!
题解
此题正是权值树状数组的应用,插入和删除都比较简单不再赘述了,重点是查询怎么查询,我们的树状数组是存储的对应权值的个数。我们在查询的时候,首先查询出a是第\(x\)大的元素,那么查询比a大k的元素就转化为查询第\(x+k\)大的元素,然后我们二分查找,判断当前的数是第几大的数,多了就向小二分,但要注意判断,如果当前找到的是第\(res\)大的数,vis[mid]代表这个数有多少个,如果\(res-vis[mid] < k 且res >= k\)说明mid就是要找的数
AC代码
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 100005
using namespace std;
typedef long long ll;
int lowbit(int x) {
return x & (-x);
}
int min(int a, int b) {return a < b ? a : b; }
int max(int a, int b) {return a > b ? a : b; }
int m;
int d[N + 5];
void update(int x, int val) {
for (; x <= N; x += lowbit(x))
d[x] += val;
}
int query(int x) {
int ans = 0;
for (; x; x -= lowbit(x))
ans += d[x];
return ans;
}
int vis[N];
int main() {
while (scanf("%d", &m) != EOF) {
memset(d, 0, sizeof(d));
memset(vis, 0, sizeof(vis));
for (int i = 1; i <= m; i++) {
int p, x;
scanf("%d", &p);
if (p == 0) {
scanf("%d", &x);
vis[x]++;
update(x, 1);
}
else if (p == 1) {
scanf("%d", &x);
if (vis[x]) {
update(x, -1);
vis[x]--;
}
else printf("No Elment!\n");
}
else {
int a, k;
scanf("%d%d", &a, &k);
int l = 1, r = N;
int ans;
if (query(r) - query(a) < k)
printf("Not Find!\n");
else {
int x = query(a) + k;
while (l <= r) {
int mid = (l + r) >> 1;
int res = query(mid);
if (res >= x) {
if (vis[mid] == 0) r = mid - 1;
else if (res - vis[mid] < x) {
ans = mid;
break;
}
else r = mid - 1;
}
else l = mid + 1;
}
printf("%d\n", ans);
}
}
}
}
return 0;
}
权值树状数组 HDU-2852 KiKi's K-Number的更多相关文章
- 【Luogu】P3760异或和(权值树状数组)
题目链接 再次声明以后我见到位运算一定第一时间想把它拆成每一位算 本题就是有个前缀和sum[],然后让你求每一位有多少对i,j满足sum[i]-sum[j]在那一位上是1 考虑怎样才能减出1来 如果s ...
- 树形DP+树状数组 HDU 5877 Weak Pair
//树形DP+树状数组 HDU 5877 Weak Pair // 思路:用树状数组每次加k/a[i],每个节点ans+=Sum(a[i]) 表示每次加大于等于a[i]的值 // 这道题要离散化 #i ...
- 【BZOJ 1901】【Zju 2112】 Dynamic Rankings 动态K值 树状数组套主席树模板题
达神题解传送门:http://blog.csdn.net/dad3zz/article/details/50638360 说一下我对这个模板的理解: 看到这个方法很容易不知所措,因为动态K值需要套树状 ...
- 当前插入的线段能完整覆盖存在的几条线段 树状数组 HDU 5372 Segment Game
http://acm.hdu.edu.cn/showproblem.php? pid=5372 Segment Game Time Limit: 3000/1500 MS (Java/Others) ...
- 主席树套树状数组——带修区间第k大zoj2112
主席树带修第k大 https://www.cnblogs.com/Empress/p/4659824.html 讲的非常好的博客 首先按静态第k大建立起一组权值线段树(主席树) 然后现在要将第i个值从 ...
- 树状数组+二分答案查询第k大的数 (团体程序设计天梯赛 L3-002. 堆栈)
前提是数的范围较小 1 数据范围:O(n) 2 查第k大的数i:log(n)(树状数组查询小于等于i的数目)*log(n)(二分找到i) 3 添加:log(n) (树状数组) 4 删除:log(n) ...
- 数值标记问题 离线+树状数组 HDU 3938 + HDU 3333
HDU 3938 题目大意:给你一个长度为n的数组a,定义区间[l,r]的val为区间内所有不同的数值之和.现在有m个询问,每次询问一个区间,问区间的val是多少. 思路:将所有的询问按照右端点排序. ...
- HDU 5877 Weak Pair(树状数组)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5877 [题目大意] 给出一棵带权有根树,询问有几对存在祖先关系的点对满足权值相乘小于等于k. [题 ...
- 【CF1042D】Petya and Array 离散化+树状数组
题目大意:给定一个长度为 N 的序列,给定常数 t,求有多少个区间 [l,r] 满足 \(\sum\limits_{i=l}^{r}a_i<t\). 题解:先跑一边前缀和,问题等价于求有多少个数 ...
随机推荐
- 【luogu P2762 太空飞行计划问题】 题解
题目链接:https://www.luogu.org/problemnew/show/P2762 算是拍照那个题的加强下. 输入真的很毒瘤.(都这么说但好像我的过了?) #include <qu ...
- js读取跨域webapi传送回来的cookie 要点
1.webapi 返回cookie时,httpOnly=false 2.webapi 接收Origins 不能为* 3.js端 请求时,withCredentials必须: true //`wit ...
- 123. Best Time to Buy and Sell Stock III ——LeetCode
Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...
- [Linux]文件浏览
1.使用file命令查看文件中数据的类型 [oracle@linuxforlijiaman Desktop]$ ls linux oracle.txt test.png [oracle@linuxfo ...
- etcd部署简单说明
etcd是一个K/V分布式存储,每个节点都保存完成的一份数据.有点类似redis.但是etcd不是数据库. 1.先说废话.之所以会用etcd,并不是实际项目需要,而是前面自己写的上传的DBCacheS ...
- linux 2.6升级Python2.7 ./configure 报错问题
升级2.7.3使用命令./configure --prefix=/usr/local/python2.7.3时,出现以下错误:checking build system type... x86_64- ...
- 老刘的Linux小课堂开课了
经过几个月的等待,刘遄老师的LINUX课堂终于开课了,从现在开始,我会在博客里将每一堂课的笔记记录下来,记录自己的每一步成长. 由于是第一次开课,老刘只是简单的介绍了LINUX相关的一些概念,比如开源 ...
- react初学
react和vue一样都是mvvm的这种开发模式. 下载js文件 引入HTML文件里 <!DOCTYPE html> <html> <head> <scrip ...
- Django---定义、MVC和MTV模式、命令行工具、配置文件settings
1.什么是web框架 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演. 对于所有的 ...
- layUI 下拉框遮挡
原项目中把layui内置的富文本编辑器替换成了百度的ueditor,但是出现了一点问题,下拉框被遮挡了! 在网上查询了一些方法,发现最简单的方法就是在当前页面的<head>标签中加入 &l ...