对顶堆算法

news2024/11/18 1:40:49

对顶堆可以动态维护一个序列上的第k大的数,由一个大根堆和一个小根堆组成,

  • 小根堆维护前k大的数(包含第k个)
  • 大根堆维护比第k个数小的数

image-20230731180249629

[CSP-J2020] 直播获奖

题目描述

NOI2130 即将举行。为了增加观赏性,CCF 决定逐一评出每个选手的成绩,并直播即时的获奖分数线。本次竞赛的获奖率为 w % w\% w%,即当前排名前 w % w\% w% 的选手的最低成绩就是即时的分数线。

更具体地,若当前已评出了 p p p 个选手的成绩,则当前计划获奖人数为 max ⁡ ( 1 , ⌊ p × w % ⌋ ) \max(1, \lfloor p \times w \%\rfloor) max(1,p×w%⌋),其中 w w w 是获奖百分比, ⌊ x ⌋ \lfloor x \rfloor x 表示对 x x x 向下取整, max ⁡ ( x , y ) \max(x,y) max(x,y) 表示 x x x y y y 中较大的数。如有选手成绩相同,则所有成绩并列的选手都能获奖,因此实际获奖人数可能比计划中多。

作为评测组的技术人员,请你帮 CCF 写一个直播程序。

输入格式

第一行有两个整数 n , w n, w n,w。分别代表选手总数与获奖率。
第二行有 n n n 个整数,依次代表逐一评出的选手成绩。

输出格式

只有一行,包含 n n n 个非负整数,依次代表选手成绩逐一评出后,即时的获奖分数线。相邻两个整数间用一个空格分隔。

样例 #1

样例输入 #1

10 60
200 300 400 500 600 600 0 300 200 100

样例输出 #1

200 300 400 400 400 500 400 400 300 300

样例 #2

样例输入 #2

10 30
100 100 600 100 100 100 100 100 100 100

样例输出 #2

100 100 600 600 600 600 100 100 100 100

提示

样例 1 解释


数据规模与约定

各测试点的 n n n 如下表:

测试点编号 n = n= n=
1 ∼ 3 1 \sim 3 13 10 10 10
4 ∼ 6 4 \sim 6 46 500 500 500
7 ∼ 10 7 \sim 10 710 2000 2000 2000
11 ∼ 17 11 \sim 17 1117 1 0 4 10^4 104
18 ∼ 20 18 \sim 20 1820 1 0 5 10^5 105

对于所有测试点,每个选手的成绩均为不超过 600 600 600 的非负整数,获奖百分比 w w w 是一个正整数且 1 ≤ w ≤ 99 1 \le w \le 99 1w99


提示

在计算计划获奖人数时,如用浮点类型的变量(如 C/C++ 中的 floatdouble,Pascal 中的 realdoubleextended 等)存储获奖比例 w % w\% w%,则计算 5 × 60 % 5 \times 60\% 5×60% 时的结果可能为 3.000001 3.000001 3.000001,也可能为 2.999999 2.999999 2.999999,向下取整后的结果不确定。因此,建议仅使用整型变量,以计算出准确值。

思路

模版题: k为i*w/100

  • 使用一个大根堆x维护比第k个数小的数
  • 使用一个小根堆y来维护前k大的数

代码

#include <bits/stdc++.h>

#define int long long
#define yes cout << "YES" << endl;
#define no cout << "NO" << endl;
#define IOS cin.tie(0), cout.tie(0), ios::sync_with_stdio(false);
#define cxk 1
#define debug(s, x) if (cxk) cout << "#debug:(" << s << ")=" << x << endl;
using namespace std;

void solve() {
    int n, w;
    cin >> n >> w;
    priority_queue<int> x;//大根堆 ,维护 ai<q
    priority_queue<int, vector<int>, greater<>> y;//小根堆,维护ai>=q;
    for (int i = 1; i <= n; i++) {
        int a;
        cin >> a;
        if (y.empty() || a >= y.top()) y.push(a);
        else x.push(a);
        int k = max((int) 1, i * w / 100);
        while (y.size() > k) x.push(y.top()), y.pop();//保持小根堆有k个元素
        while (y.size() < k) y.push(x.top()), x.pop();
        cout << y.top() << " ";
    }
}

signed main() {
    IOS
#ifndef ONLINE_JUDGE
    freopen("../test.in", "r", stdin);
    freopen("../test.out", "w", stdout);
#endif
    int _ = 1;
    while (_--) solve();
    return 0;
}

[ABC306E] Best Performances

题面翻译

题目描述:

给定长度为 N N N 的数列 A = ( A 1 , A 2 , … , A N ) A=(A_1,A_2,\dots,A_N) A=(A1,A2,,AN),最开始所有项均为 0 0 0

定义函数 f ( A ) f(A) f(A) 如下:

A A A 按照降序(即使得 A A A 为广义单调递减序列)排序得到 B B B
f ( A ) = B 1 + B 2 + ⋯ + B K f(A)=B_1+B_2+\dots+B_K f(A)=B1+B2++BK,其中 B B B 为排序后的数列, K K K A A A 中不为 0 0 0 的元素个数。

现在对该数列进行 Q Q Q 次更新。对于每次更新,按顺序执行以下操作,并输出此时的 f ( A ) f(A) f(A) 值:

A X i A_{X_i} AXi 更改为 Y i Y_i Yi

题目描述

样例 #1

样例输入 #1

4 2 10
1 5
2 1
3 3
4 2
2 10
1 0
4 0
3 1
2 0
3 0

样例输出 #1

5
6
8
8
15
13
13
11
1
0

提示

  • $ 1\ \le\ K\ \le\ N\ \le\ 5\ \times\ 10^5 $
  • $ 1\ \le\ Q\ \le\ 5\ \times\ 10^5 $
  • $ 1\ \le\ X_i\ \le\ N $
  • $ 0\ \le\ Y_i\ \le\ 10^9 $

思路

可以使用对顶堆,这里涉及到修改操作,因此可以使用multiset维护方便一些

  • a维护前k大为小根堆
  • b维护比第k个数小的,大根堆

使用res来维护前k大的和。

代码

#include <bits/stdc++.h>

#define int long long
#define yes cout << "YES" << endl;
#define no cout << "NO" << endl;
#define IOS cin.tie(0), cout.tie(0), ios::sync_with_stdio(false);
#define cxk 1
#define debug(s, x) if (cxk) cout << "#debug:(" << s << ")=" << x << endl;
using namespace std;

const int N = 5e5 + 10;
int n, k, q, res;
int w[N];
multiset<int> a, b;

//a维护前k大,小根堆    b维护比第k个数小的,大根堆
void solve() {
    cin >> n >> k >> q;
    for (int i = 1; i <= k; i++)a.insert(0);
    for (int i = 1; i <= n - k; i++) b.insert(0);
    while (q--) {
        int x, y;
        cin >> x >> y;
        if (a.find(w[x]) != a.end()) a.erase(a.find(w[x])), res -= w[x];
        else b.erase(b.find(w[x]));
        w[x] = y;
        if (!b.empty() && y >= *b.rbegin()) a.insert(y), res += y;
        else b.insert(y);
        while (a.size() > k) {
            b.insert(*a.begin());
            res -= *a.begin();
            a.erase(a.begin());
        }
        while (a.size() < k) {
            a.insert(*b.rbegin());
            res += *b.rbegin();
            b.erase(b.find(*b.rbegin()));
        }
        cout << res << endl;
    }
}

signed main() {
    IOS
#ifndef ONLINE_JUDGE
    freopen("../test.in", "r", stdin);
    freopen("../test.out", "w", stdout);
#endif
    int _ = 1;
    while (_--) solve();
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/816554.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【暑期每日一练】 day10

目录 选择题 &#xff08;1&#xff09; 解析&#xff1a; &#xff08;2&#xff09; 解析&#xff1a; &#xff08;3&#xff09; 解析&#xff1a; &#xff08;4&#xff09; 解析&#xff1a; &#xff08;5&#xff09; 解析&#xff1a; 编程题 题一 …

Klipper seria.c 文件代码分析

一. 前言 Klipper 底层硬件的串口模块程序写的是否正确是决定下位机与上位机能否正常通信的前提&#xff0c;如果这个文件的驱动没写好&#xff0c;那上位机控制下位机就无从谈起&#xff0c;更无法通过上位机去验证下位机程序的正确性。 本篇博文将详细解析 Klipper src 文件夹…

提词器怎么用?这个方法看一看

提词器怎么用&#xff1f;在现代社会中&#xff0c;提词器的应用场景非常广泛。除了学习、工作、听力障碍和翻译&#xff0c;它还可以应用于其他领域&#xff0c;如演讲、广播、新闻报道等。比如说&#xff0c;在演讲中&#xff0c;提词器可以帮助演讲者更好地掌握演讲内容。演…

网络防御之VPN

配置IKE 第一阶段 [r1]ike proposal 1 [r1-ike-proposal-1]encryption-algorithm aes-cbc-128 [r1-ike-proposal-1]authentication-algorithm sha1 [r1-ike-proposal-1]dh group2 [r1-ike-proposal-1]authentication-method pre-share[r1]ike peer aaa v1 [r1-ike-peer-aaa…

提升数据质量的四大有效方式

在数字时代的今天&#xff0c;企业对于高质量、值得信赖的数据的需求越来越高。 目前&#xff0c;已经有很多企业将数据质量视为技术问题而非业务问题&#xff0c;这也是获取高质量数据的最大限制因素。只有查找技术缺陷&#xff0c;例如重复数据、缺失值、乱序序列&#xff0…

api自动化测试

API测试已成为日常的测试任务之一&#xff0c;为了提高测试效率&#xff0c;减少重复的手工操作&#xff0c;API自动化测试也逐渐变得愈加重要&#xff0c;本文是自己在API自动化测试方面的一些经验积累和心得、汇总成文&#xff0c;以飨读者 我相信自动化技能已经成为高级测试…

uniapp跨域解决

uniapp跨域解决 跨域是什么 跨域指的是浏览器不能执行其他网站的脚本&#xff0c;当一个网页去请求另一个域名的资源时&#xff0c;域名、端口、协议任一不同&#xff0c;就会存在跨域。跨域是由浏览器的同源策略造成的&#xff0c;是浏览器对JavaScript施加的安全限制。 报错…

直线导轨的精密等级以及划分依据

直线导轨的作用&#xff0c;是用来支撑和引导运动部件&#xff0c;按给定的方向做往复直线运动的&#xff0c;直线导轨是高精密度的传动元件&#xff0c;广泛使用在各行各业中。 直线导轨的精密等级是判断产品质量的一个重要指标。在众多种类的直线导轨产品中&#xff0c;精密等…

【BASH】回顾与知识点梳理(一)

【BASH】回顾与知识点梳理 一 前言一. 认识与学习 BASH1.1 硬件、核心与 Shell1.2 为何要学文字接口的 shell&#xff1f;1.3 系统的合法 shell 与 /etc/shells 功能1.4 Bash shell 的功能1.5 查询指令是否为 Bash shell 的内建命令&#xff1a; type1.6 指令的下达与快速编辑按…

vue3搭建Arco design UI框架

技术&#xff1a;Vue3.2.40 UI框架&#xff1a;Arco design 2.44.7 需要安装:yarn 1.22.19 和npm 8.19.4 1.第一步安装本地全局arco脚手架 管理员运行CMD npm i -g arco-cli安装成功后如下&#xff1a; 2.第二步在需要存放项目的文件夹拉取项目 我这里把项目存放在 D:\W…

CTF:信息泄露.(CTFHub靶场环境)

CTF&#xff1a;信息泄露.&#xff08;CTFHub靶场环境&#xff09; “ 信息泄露 ” 是指网站无意间向用户泄露敏感信息&#xff0c;泄露了有关于其他用户的数据&#xff0c;例如&#xff1a;另一个用户名的财务信息&#xff0c;敏感的商业 或 商业数据 &#xff0c;还有一些有…

【枚举+结论】icpc2022 济南 A

Problem - A - Codeforces 题意&#xff1a; 思路&#xff1a; 本来的思路是这样的 考虑最后会变成什么数&#xff0c;手摸了几个发现&#xff0c;都是2&#xff0c;不论本来的集合是不是包含2 然后就是猜测是不是直接变成2就好了 然后要去掉m个&#xff0c;直接考虑去掉最…

高速过孔同进同出?到底是什么一种设计体验

高速先生成员--黄刚 每当来一个比较新的概念时&#xff0c;高速先生总是非常的喜欢&#xff0c;随之而来的求知欲也会爆发个小宇宙。其实问题的来源是我们公司的北京分部的资深设计工程师&#xff0c;北京分部本身也是我司全国20多个分部里设计能力最强的分部之一了&#xff0c…

类的封装和包(JAVA)

封装 所有的OOP语言都会有三个特征&#xff1a; 封装&#xff1b;继承&#xff1b;多态。 本篇文章会为大家带来有关封装的知识。 在我们日常生活中可以看到电视就只有那么几个按键&#xff08;开关&#xff0c;菜单……&#xff09;和一些接口&#xff0c;而而我们通过这些东…

Day08-作业(MySQLMybatis入门)

作业1&#xff1a;多表查询 数据准备&#xff1a; 重新创建一个数据库 db03_homework 执行如下脚本&#xff0c;创建表结构&#xff0c;导入测试数据 -- 部门管理 create table tb_dept(id int unsigned primary key auto_increment comment 主键ID,name varchar(10) not n…

想了解好用的翻译pdf的软件吗?

在全球化的时代背景下&#xff0c;跨国贸易越来越普遍&#xff0c;跨语言沟通也越来越频繁。小黄是一家跨国公司的员工&#xff0c;他梦想能在全球各地拓展自己的业务&#xff0c;奈何遇到了一个巨大的挑战&#xff1a;跨语言沟通。在这其中&#xff0c;pdf文件是他经常接收到的…

CNN-NER论文详解

论文&#xff1a;https://arxiv.org/abs/2208.04534 代码&#xff1a;https://github.com/yhcc/CNN_Nested_NER/tree/master 文章目录 有关工作前期介绍CNN-NER模型介绍 代码讲解主类多头biaffineCNNLoss解码数据传入格式 参考资料 有关工作 前期介绍 过去一共主要有四类方式…

基于canvas画布的实用类Fabric.js的使用

目录 前言 一、Fabric.js简介 二、开始 1、引入Fabric.js 2、在main.js中使用 3、初始化画布 三、方法 四、事件 1、常用事件 2、事件绑定 3、事件解绑 五、canvas常用属性 六、对象属性 1、基本属性 2、扩展属性 七、图层层级操作 八、复制和粘贴 1、复制 2…

高并发架构去重难?架构必备技能 - 布隆过滤器

系列文章目录 当Dubbo遇到高并发&#xff1a;探究流量控制解决方案 主从选举机制&#xff0c;架构高可用性的不二选择 高并发架构去重难&#xff1f;架构必备技能 - 布隆过滤器 系列文章目录前言一、布隆过滤器简介二、特性与应用场景三、参数定制四、java版本的Demo五、总结 …

安全学习DAY13_WEB应用源码获取

信息打点-WEB应用-源码获取 文章目录 信息打点-WEB应用-源码获取小节概述-思维导图资产架构-源码获取&#xff08;后端&#xff09;后端-开源后端-闭源-源码泄露源码泄露原因源码泄露方式集合网站备份压缩包git&#xff0c;svn源码泄露DS_Store文件泄露composer.json 泄露资源搜…