引入

权值树状数组就是数组下标是数值的数组,数组存储下标对应的值有几个数

题目 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的更多相关文章

  1. 【Luogu】P3760异或和(权值树状数组)

    题目链接 再次声明以后我见到位运算一定第一时间想把它拆成每一位算 本题就是有个前缀和sum[],然后让你求每一位有多少对i,j满足sum[i]-sum[j]在那一位上是1 考虑怎样才能减出1来 如果s ...

  2. 树形DP+树状数组 HDU 5877 Weak Pair

    //树形DP+树状数组 HDU 5877 Weak Pair // 思路:用树状数组每次加k/a[i],每个节点ans+=Sum(a[i]) 表示每次加大于等于a[i]的值 // 这道题要离散化 #i ...

  3. 【BZOJ 1901】【Zju 2112】 Dynamic Rankings 动态K值 树状数组套主席树模板题

    达神题解传送门:http://blog.csdn.net/dad3zz/article/details/50638360 说一下我对这个模板的理解: 看到这个方法很容易不知所措,因为动态K值需要套树状 ...

  4. 当前插入的线段能完整覆盖存在的几条线段 树状数组 HDU 5372 Segment Game

    http://acm.hdu.edu.cn/showproblem.php? pid=5372 Segment Game Time Limit: 3000/1500 MS (Java/Others)  ...

  5. 主席树套树状数组——带修区间第k大zoj2112

    主席树带修第k大 https://www.cnblogs.com/Empress/p/4659824.html 讲的非常好的博客 首先按静态第k大建立起一组权值线段树(主席树) 然后现在要将第i个值从 ...

  6. 树状数组+二分答案查询第k大的数 (团体程序设计天梯赛 L3-002. 堆栈)

    前提是数的范围较小 1 数据范围:O(n) 2 查第k大的数i:log(n)(树状数组查询小于等于i的数目)*log(n)(二分找到i) 3 添加:log(n) (树状数组) 4 删除:log(n) ...

  7. 数值标记问题 离线+树状数组 HDU 3938 + HDU 3333

    HDU 3938 题目大意:给你一个长度为n的数组a,定义区间[l,r]的val为区间内所有不同的数值之和.现在有m个询问,每次询问一个区间,问区间的val是多少. 思路:将所有的询问按照右端点排序. ...

  8. HDU 5877 Weak Pair(树状数组)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5877 [题目大意] 给出一棵带权有根树,询问有几对存在祖先关系的点对满足权值相乘小于等于k. [题 ...

  9. 【CF1042D】Petya and Array 离散化+树状数组

    题目大意:给定一个长度为 N 的序列,给定常数 t,求有多少个区间 [l,r] 满足 \(\sum\limits_{i=l}^{r}a_i<t\). 题解:先跑一边前缀和,问题等价于求有多少个数 ...

随机推荐

  1. 【luogu P1821 [USACO07FEB]银牛派对Silver Cow Party】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1821 反向多存一个图,暴力跑两遍 #include <cstdio> #include < ...

  2. Android学习笔记_54_自定义 Widget (Toast)

    1.Toast控件: 通过查看源代码,发现Toast里面实现的原理是通过服务Context.LAYOUT_INFLATER_SERVICE获取一个LayoutInflater布局管理器,从而获取一个V ...

  3. putty 启动 linux 下的oracle

    没搞过linux ,仅作记录: 1 打开putty.exe 程序 ,选择 连接 2 输入linux 的用户名和密码后,按下图操作: 3  启动监听 4 命令总结: 1.  sudo su - orac ...

  4. 怎样在Swift中使用CocoaPods

    怎样在Swift中使用CocoaPods 它不是神秘的亚马逊区域的部落人用手捡出来的生可可的豆荚,肯定不是!让CocoaPods website来回答可能是最好的: CocoaPods是Cocoa项目 ...

  5. iOS开发 | 自定义不规则label

    其中有一个不太规则的label:   image.png 这个label顶部的两个角是圆角,底部的两个角是直角,底部还有一个小三角. 思路 CAShapeLayer联合UIBezierPath画一个不 ...

  6. excel导入到java/导出到excel

    package com.test.order.config; import com.test.order.domain.HavalDO; import org.apache.poi.ss.usermo ...

  7. DLL DEF文件编写方法 VC++ 调用、调试DLL的方法 显式(静态)调用、隐式(动态)调用

    DLL 文件编写方法: 1.建立DLL工程 2.声明.定义要导出的函数 BOOL WINAPI InitDlg( HWND hTabctrl,TShareMem* pTshare,CRect* prc ...

  8. 吐血分享:QQ群霸屏技术(初级篇)

    QQ群,仿似一个冷宫;But,你真摒弃不起. 某人,坐拥2000多个2000人群,月收入10w+,此类人数少,皆因多年的沉淀,以形成完全的壁垒,难以企及的层次. 流量的分散,QQ群相对比较优质的地带, ...

  9. 【PHP】PHP常用数组(Array)函数整理

    整理了一份PHP开发中数组操作大全,包含有数组操作的基本函数.数组的分段和填充.数组与栈.数组与列队.回调函数.排序.计算.其他的数组函数等. 一.数组操作的基本函数 数组的键名和值 array_va ...

  10. yii 自带RBAC

    common:中加 'authManager' => [ 'class' => 'yii\rbac\DbManager', 'itemTable' => 'auth_item', ' ...