HDU 2852 KiKi's K-Number
一、题目大意
给定三种操作:
0 x
表示把x
插入容器 ;
1 x
表示删除一个x
如果没有x
则输出 No Elment!
;
2 a k
表示比a
大的数中的第k
大的数 如果没有输出No Find!
二、解题思路
- 树状数组维护元素出现次数(权值)前缀和即可
- 操作即修改
- 操作先查询是否存在,如果存在删除一个即可
- 操作可以用二分逐渐逼近答案
三、二分+树状数组+维护个数
复杂度:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
typedef long long LL;
using namespace std;
const int N = 100010;
// 树状数组模板
#define lowbit(x) (x & -x)
typedef long long LL;
int c[N];
void add(int x, int v) {
while (x < N) c[x] += v, x += lowbit(x);
}
LL sum(int x) {
LL res = 0;
while (x) res += c[x], x -= lowbit(x);
return res;
}
int main() {
#ifndef ONLINE_JUDGE
freopen("HDU2852.in", "r", stdin);
#endif
// 加快读入
ios::sync_with_stdio(false), cin.tie(0);
int m;
while (cin >> m) {
memset(c, 0, sizeof c);
while (m--) {
int op;
cin >> op;
if (op == 0) {
int x;
cin >> x;
add(x, 1);
} else if (op == 1) {
int x;
cin >> x;
if (sum(x) - sum(x - 1) == 0)
puts("No Elment!");
else
add(x, -1);
} else {
int a, k;
cin >> a >> k;
int x = sum(a);
if (sum(N - 1) - x < k) // 剩余数量不足K个
puts("Not Find!");
else {
int l = 1, r = N - 1;
while (l < r) {
int mid = (l + r) >> 1;
if (sum(mid) - x >= k)
r = mid;
else
l = mid + 1;
}
printf("%d\n", l);
}
}
}
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2018-05-05 为电子书包配置透明网关+缓存服务器
2012-05-05 使用MEMCACHED的思考