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. java日期类的计算问题_java日期计算(Calendar类)
  2. android仿支付宝弹窗,【转】MUI自定义底部弹窗自带遮罩层仿支付宝支付弹窗
  3. 在自定义HttpHandler中如何使用Session
  4. python separator_在Python中使用分隔符变量拆分字符串
  5. 信天游机票电子行程单_4月1日起,取得火车票、飞机票等咋抵扣?权威解答来了...
  6. 8.0强行转换后变成了7_DCDC电源转换器应用FHP8N60型号,可替代FQP8N60参数的国外场效应管!...
  7. 股票的资产重组什么意思?
  8. JavaScript + CSS3 实现的海报画廊特效
  9. python构建huffman树_python:哈夫曼树,PythonHuffuman
  10. js阻止浏览器默认事件
  11. Gstreamer插件编译安装的Makefile
  12. 接口测试用例设计和sql注入
  13. while循环python次数定义_Python学习笔记之While循环用法分析
  14. 【张朝阳的物理课笔记】 5. 波动方程,声音在空气中的传播速度
  15. apache OpenNLP简要介绍
  16. 微信小程序 编程小结(不定期更新)
  17. Tableau数据分析笔记-Chapter08数据分层、数据分组、数据集
  18. Unity检测IOS刘海屏
  19. xp计算机无法远程桌面连接,XP sp3系统下远程桌面不能连接到指定计算机的解决方案...
  20. 手动安装Python库或安装第三方库的方法

热门文章

  1. 尾调用优化 java_为什么JVM仍然不支持尾调用优化?
  2. wms地图绘制工具_移情地图,了解用户需求的利器
  3. 推荐7个高质量的学术公众号
  4. 比起掉头发,我更怕掉队
  5. 利用11行Python代码,盗取了室友的U盘,内容十分刺激!
  6. html写出日出,描写日出优美句子
  7. java分页的工具类,java分页工具类
  8. r语言主成分分析_PCA主成分分析
  9. 单片机断电后静态存储区里面还有数据吗_单片机启动流程和存储架构详解
  10. windows server 2003中 如何限制用户修改计算机名,Windows命令行下修改文件访问控制权限 -电脑资料...