Multiset

可能更好的阅读体验

思路

二分 + 树状数组做法

我们发现每个数的范围是$ <= 1e6$的,所以可以直接在线操作,不用离散化离线操作。

这个时候我们的treetreetree数组就相当与一个桶,每个桶里统计的是值为其下标的个数,通过树状数组的前缀和性质,我们可以通过二分轻松的锁定第kkk项的位置,然后进行删除操作,具体的操作细节看代码实现。

权值线段树做法

线段相较而言,常数大一些,维护的基本思路还是更树状数组是一样的。当我树状数组1122ms1122 ms1122ms过了之后,感觉线段树有点悬,然后就没写了,这里只是提供一个思路。

代码

#include <bits/stdc++.h>using namespace std;typedef long long ll;
const int N = 1e6 + 10;int tree[N], n, m;inline ll read() {ll x = 1, s = 0; char c;c = getchar();while(c < '0' || c > '9') {if(c == '-')    x = -1;c = getchar();}while(c >= '0' && c <= '9') {s = (s << 1) + (s << 3) + (c ^ 48);c = getchar();}return x * s;
}inline int lowbit(int x) {return (-x) & (x);
}inline void add(int x, int value) {while(x <= n) {tree[x] += value;x += lowbit(x);}
}inline int get_sum(int x) {int sum = 0;while(x) {sum += tree[x];x -= lowbit(x);}return sum;
}int main() {// freopen("in.txt", "r", stdin);n = read(), m = read();for(int i = 1; i <= n; i++) {int x = read();add(x, 1);}// for(int i = 1; i <= n; i++)//调试用的,可以不管。//     printf("%d%c", get_sum(i), i == n ? '\n' : ' ');for(int i = 1; i <= m; i++) {int x = read();if(x > 0)   add(x, 1);//插入操作简单,只需要修改其数组下标就行。else {x = abs(x);int l = 1, r = n;while(l < r) {//找到第一个其前缀和大于等于k的下标,修改其值。int mid = l + r >> 1;if(get_sum(mid) >= x)   r = mid;else l = mid + 1;}add(l, -1);}// for(int i = 1; i <= n; i++)// printf("%d%c", get_sum(i), i == n ? '\n' : ' ');}int l = 1, r = n;while(l < r) {//寻找第一个大于等于一的下标,其下标就是在集合中一定存在的数。int mid = l + r >> 1;if(get_sum(mid) >= 1)   r = mid;else l = mid + 1;}if(get_sum(l) >= 1) printf("%d\n", l);//特判一下查找结果。else    puts("0");return 0;
}

D. Multiset(树状数组 + 二分)相关推荐

  1. VK Cup 2012 Qualification Round 2 C. String Manipulation 1.0 线段树 or 树状数组+二分

    http://codeforces.com/problemset/problem/159/C 题意: 给你一个字符串s,给出一个数k,k倍的s串组成新串str.然后给出n个操作,每个操作对应着pi,c ...

  2. P2161 [SHOI2009]会场预约[线段树/树状数组+二分/STL]

    题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...

  3. POJ2828 Buy Tickeys 树状数组+二分 线段树留坑。。。

    题意:一堆人排队买票,告诉你一堆人的序号(序号的意思是插在"当前"第几个人的后面)和姓名(姓名用编号代替). 思路:线段树 或 树状数组+二分(自己还不会线段树,所以这里继续留坑) ...

  4. 树状数组 + 二分 - Query HDU - 4339

    树状数组 + 二分 - Query HDU - 4339 题意: T组测试用例,每组给定两个长度分别为l1和l2的字符串s1,s2.有两种询问:①.1idic:将第id个字符串的第i个字符变成字符c. ...

  5. 最长上升子序列(LIS)/最长不上升子序列问题算法详解+例题(树状数组/二分优化,看不懂你来打我)

    目录 最长上升子序列 一.朴素做法O(2n)O(2^n)O(2n) 二.优化做法O(nlogn)O(nlogn)O(nlogn) 三.例题引入:P1020 导弹拦截(求最长上升子序列和最长不上升子序列 ...

  6. POJ 2182 Lost Cows [树状数组+二分]

    Description N (2 <= N <= 8,000) cows have unique brands in the range 1..N. In a spectacular di ...

  7. CF1404C:Fixed Point Removal(离线)(树状数组二分)

    解析 写了不少线段树上二分,原来树状数组上也是可以二分的 首先如果ai>ia_i>iai​>i,那必然无法删除,下面只考虑ai<=ia_i<=iai​<=i的情况 ...

  8. CF1446F-Line Distance【计算几何,树状数组,二分】

    正题 题目链接:https://www.luogu.com.cn/problem/CF1446F 题目大意 给出nnn个点,求所有点对构成的直线中与原点距离第kkk小的距离 2≤n≤105,1≤k≤n ...

  9. P6619-[省选联考2020A/B卷]冰火战士【树状数组二分】

    正题 题目链接:https://www.luogu.com.cn/problem/P6619 题目大意 有火系战士和冰系战士有一个温度和一个战斗力,每次加入或删除一个战士,要求一个最大的kkk使得温度 ...

最新文章

  1. torch.log函数
  2. 电脑换ip软件_为什么会有企业需要软件换IP?
  3. zip() python
  4. JZOJ 5458. 【NOIP2017提高A组冲刺11.7】质数
  5. j2ee servlet 和 threadlocal ,synchronized 与 web容器
  6. 吃屎是一种什么样的体验?
  7. ipad如何与计算机连接网络连接不上,平板电脑网络连接不上怎么办
  8. Java Web学习总结(42)——JavaEE常用的13种核心API与组件
  9. python项目实战:模拟登陆CSDN
  10. 关于wait、notify在火车售票战的实例
  11. 浅谈算法和数据结构: 二 基本排序算法
  12. java jsp高校贫困生助学贷款系统ssm框架
  13. 软件评测师考试(下午考点,要背)
  14. 旋转矩阵(Rotation matrix):旋转轴与旋转角 ( axis and angle )
  15. [CTF]盲文对照表
  16. 18. Zigbee应用程序框架开发指南 - 应用框架V6
  17. 结构体的定义以及使用
  18. 独立IP、特产浏览量(PV)、访问次数(VV)、独立访客(UV)
  19. 游戏数据库 TcaplusDB
  20. 最后剩下的,只有随遇而安,偶尔我会想起你:伤感日志

热门文章

  1. 超形象!流体版的勾股定理演示动图...
  2. 大数据告诉你:学历真的能改变命运!!
  3. 22张令人叹为观止的照片,你所未知的另一面
  4. 乔布斯死后的300亿遗产终于被败光了,没想到竟是干了这件事
  5. 有趣的灵魂,从高质量的阅读开始
  6. char varchar java_在数据库中varchar与char的区别
  7. python模拟键盘输入_这件神器,每个 Python入门学习者都值得一试
  8. php导出数据库的指定表数据,MYSQL教程mysql数据库导出指定表数据的方法
  9. mysql的外键_mysql如何查看外键
  10. mui 时间样式错乱_微信编辑器样式排版错位怎么回事?