EC R 87 div2 D. Multiset 线段树 树状数组 二分
2024-09-03 11:33:12
LINK:Multiset
主要点一下 二分和树状数组找第k大的做法.
线段树的做法是平凡的 开一个数组实现就能卡过.
考虑如树状数组何找第k大 二分+查询来判定是不优秀的。
考虑树状数组上倍增来做. 考虑从0开始跳 定义跳到的节点为前缀和.
那么不断跳累加权值即可.
第三种做法是二分 (其实我最先想到的是类似的做法.
观察到答案最终只要一个数字 受到第三个样例的启发 考虑维护最大值/最小值.
直接开堆乱搞是不正确的 无法衡量之前是否删除当前的最大值了.
考虑二分这个最大值/最小值
这里以最小值为例 因为比较好描述 那么check 就是看一下<=mid的数字是否都被删掉了.
这样做可以发现满足判定的单调性.
这里用的是第一种做法。
const int MAXN=1000010;
int n,Q;
int sum[MAXN<<2];
inline void insert(int p,int l,int r,int x)
{
++sum[p];
if(l==r)return;
int mid=(l+r)>>1;
if(x<=mid)insert(zz,l,mid,x);
else insert(yy,mid+1,r,x);
}
inline int ask(int p,int l,int r,int k)
{
if(l==r)return l;
int mid=(l+r)>>1;
if(sum[zz]>=k)return ask(zz,l,mid,k);
return ask(yy,mid+1,r,k-sum[zz]);
}
inline void erase(int p,int l,int r,int x)
{
--sum[p];
if(l==r)return;
int mid=(l+r)>>1;
if(x<=mid)erase(zz,l,mid,x);
else erase(yy,mid+1,r,x);
}
int main()
{
freopen("1.in","r",stdin);
get(n);get(Q);
rep(1,n,i)insert(1,1,n,read());
rep(1,Q,i)
{
int get(x);
if(x>0)insert(1,1,n,x);
else erase(1,1,n,ask(1,1,n,-x));
}
if(!sum[1])put(0);
else put(ask(1,1,n,1));
return 0;
}
最新文章
- 安装并使用PHPunit
- 六个创建模式之建造者模式(Builder Pattern)
- Nginx+HTTPS(SSL/TLS)
- 使用复合索引代替单键索引,来避免单键有null值的情况
- J2EE 第二阶段项目之分析业务
- Python 温习
- 利用while(code!=EOF){}来实现“无限”循环
- 运维人愿意听到的话 vs 不愿意听到的话
- iOS银行卡合法性校验
- Properties操作
- mysql索引使用技巧及注意事项
- css解决IE6,IE7,firefox兼容性问题
- Docker安装+HelloWorld+运行Tomcat
- CentOS7 防火墙(firewall)的操作命令(转)
- 『计算机视觉』物体检测之RefineDet系列
- Nginx配置多个基于域名的虚拟主机+实验环境搭建+测试
- The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar报错
- Linux基础命令---ipcalc计算IP
- 打开RAD Studio XE5提示";displayNotification:内存不够";解决办法
- 深入理解Linux内核-回收页框
热门文章
- css文字不透明度怎么设置?
- Web开发HTTP协议知识_常用http方法、http状态码等(前端开发和面试必备))
- SCOI 2010 连续攻击游戏(贪心,图论)
- 小程序爬坑(一)之时间格式IOS的兼容
- 技术干货丨通过wrap malloc定位C/C++的内存泄漏问题
- Mysql基础(五):多表查询、pymysql模块
- 数据可视化之PowerQuery篇(八)利用PowerQuery,进行更加灵活的数据分列
- 接口测试框架实战(三)| JSON 请求与响应断言
- 02-Python运算符
- 《你还在写sql语句吗?》人生苦短,进入MybatisPlus的丝滑体验