权值树状数组 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\). 题解:先跑一边前缀和,问题等价于求有多少个数 ...
随机推荐
- Android学习笔记_23_服务Service之AIDL和远程服务实现进程通信以及进程间传递自定义类型参数
一.了解AIDL语言: 在Android中, 每个应用程序都有自己的进程,当需要在不同的进程之间传递对象时,该如何实现呢? 显然, Java中是不支持跨进程内存共享的.因此要传递对象, 需要把对象解析 ...
- [译]GLUT教程 - 安装
Lighthouse3d.com >> GLUT Tutorial >> Basics >> Setup 你需要什么 要用GLUT库开发程序,你可以下载最新版本3. ...
- pv与单广告位曝光统计优化
上一篇文章<巧用域名发散,缓解单广告位并发请求限制>中提到了我已经将广告的数据请求写成了单广告位请求.既然数据请求都已经是单广告位的了,那么曝光统计也理所应当是单广告位的. pv是什么? ...
- 2018-03-21 11:34:44 java脚本批量转换java utf-8 bom源码文件为utf-8编码文件
package com.springbootdubbo; import java.io.*;import java.util.ArrayList;import java.util.List; /** ...
- jenkins添加环境变量 ,win 10的 环境变量如下,win7 就是不加也可以运行,不报 “python 不是内部命令 ” 的错误。
jenkins 添加win 10的 环境变量如下,win7 就是不加也可以运行,不报 “python 不是内部命令 ” 的错误,暂时不知道怎么回事. jenkins这样添加环境变量 .
- POJ 1113--Wall(计算凸包)
Wall Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 40363 Accepted: 13754 Description On ...
- C++最接近整数的浮点运算
Function return ceil 不小于给定值的最接近整数值 floor 不大于给定值的最接近整数 trunc (C++11) 绝对值不大于给定值的最接近整数 round(C++11) 最接近 ...
- MySql Connector/C++8结果集处理Demo
#include <iostream> #include <exception> #include <mysqlx/xdevapi.h> using std::co ...
- BZOJ1432: [ZJOI2009]Function(找规律)
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1523 Solved: 1128[Submit][Status][Discuss] Descriptio ...
- Python的核心数据类型
Python的核心数据类型有:数字,字符串,列表,字典,元组,文件等. 数字 数字类型有:整形int,浮点型float,复数complex,布尔型bool. 整形 整型数是不带有小数部分的 ...