又放学辣(进阶)(两次二分或两次后缀和)(小白80D)

D-又放学辣(进阶)_牛客小白月赛80 (nowcoder.com)

思路:

求最大值的最小值,=》二分;

对于check函数,我们要统计cnt=\sum_{1}^{m}(a[i]-t)的和(t为二分的量),如果cnt<k,说明答案小于t,否则大于t;

时间复杂度为:n*log(n)*log(n)

代码:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<math.h>
#include<unordered_map>
#include<map>
using namespace std;
typedef long long LL;
#define  per(i,a,b)  for(int i=a;i<=b;i++) 
const int  N = 1e6 + 100;
int n, k, m, sum, mi;
int  a[N], x, b[N];
int  c[N];
bool cmp(int x, int y)
{
    return x > y;
}
int check(int x, int i)
{   
    int l = 1, r = m, mid, ans = 0, cha;
    while (l <= r)
    {
        mid = (l + r) / 2;
        if (b[mid] >= x)
            ans = mid, l = mid + 1;
        else
            r = mid - 1;
    }
    if (b[ans] <= a[i])
        cha = c[ans] - a[i] - (ans - 1) * x;
    else
        cha = c[ans] - ans * x;
    if (cha <= k||ans==0) return 1;
    return 0;
}
int main()
{
    scanf("%d%d%d", &n, &m, &k);
    per(i, 1, n)
    {
        scanf("%d", &x);
        a[x]++;
    }
    per(i, 1, m) b[i] = a[i];
    sort(b + 1, b + 1 + m, cmp);
    per(i, 1, m) c[i] = c[i - 1] + b[i];
    int l, r, mid;
    per(i, 1, m)
    {
        if (n < k + a[i])
        {
            printf("-1 ");
            continue;
        }
        l = 0;
        r = n - k - a[i];
        mi = -1;
        while (l <= r)
        {
            mid = (l + r) >> 1;
            int y = check(mid, i);
            if (y)
            {
                   r = mid - 1;
                    mi = mid;
            }
            else
                l = mid + 1;
        }
        printf("%d ", mi);
    }
    return 0;
}

思路二:

我们将b[x]代表大于x的总人数;

最开始有一次循环b[a[i]-1]++,表示大于a[i]的数+1;

第一次差分(从后往前):b[i]代表大于i的数有多少个;

第二次差分(从后往前):b[i]代表大于i总共有多少。

代码:

.#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<math.h>
#include<unordered_map>
#include<map>
using namespace std;
typedef long long LL;
#define per(i,a,b) for(int i=a;i<=b;i++)
#define ber(i,a,b) for(int i=a;i>=b;i--)
const int  N = 1e6 + 100;
int n, k, m, mi;
int  a[N], x, b[N]; 
int check(int x, int i)
{
    int y=b[x];
    if (a[i] > x)
        y -= (a[i] - x);
    return y<=k;
}
int main()
{
    scanf("%d%d%d", &n, &m, &k);
    per(i, 1, n)
    {
        scanf("%d", &x);
        a[x]++;
    }
    per(i, 1,m)
        b[a[i]-1]++;
    ber(i, n, 0)
        b[i] += b[i+1];
    ber(i, n, 0)
        b[i] += b[i+1];
    int l, r, mid;
    per(i, 1, m)
    {
        if (n< k + a[i])
        {
            printf("-1 ");
            continue;
        }
        l = 0;
        r = n - k- a[i];
        mi = -1;
        while (l <= r)
        {
            mid = (l + r) >> 1;
            int y = check(mid, i);
            if (y)
            {
                r = mid - 1;
                mi = mid;
            }
            else
                l = mid + 1;
        }
        if (mi == -1) printf("-1 ");
        else printf("%d ", mi);
    }
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

锁表后引发的几种删除方式与不同的扩展

在开发过程可能会遇到一些特殊场景&#xff0c;诸如我想删除某表&#xff0c;但是无法删除&#xff0c;去找原因发现是发生了锁表&#xff0c; 锁表指的是在执行一个事务时&#xff0c;该事务获取了一个锁并保持其锁定状态&#xff0c;直到事务完成或手动释放锁&#xff0c;导…

企业3D虚拟展台在线生成工具的功能特点

3D虚拟云展平台提供的上千个素材模版&#xff0c;还有用户编辑和上传的成功案例&#xff0c;此外&#xff0c;三维营销编辑器支持在线选择展台模版、建筑物、产品、特效、动画、图文及视频等&#xff0c;也可以自行上传3D模型/图文视频素材到对应分区&#xff0c;选择自己准备的…

【c++|opencv】二、灰度变换和空间滤波---2.直方图和均衡化

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 图像直方图、直方图均衡化 1. 图像直方图 #include <iostream> #include <opencv2/opencv.hpp>using namespace cv; using namespace std;…

项目赶工期,如何预防团队成员任务冲突?

项目赶工期时&#xff0c;如果发生任务冲突&#xff0c;往往会直接影响工作进度和效率&#xff0c;可能会导致任务的延误或错失关键节点&#xff0c;进而影响整个项目进度。因此预防团队成员任务冲突对于项目进度至关重要。它可以提高工作效率&#xff0c;保证项目进度&#xf…

MSQL系列(十) Mysql实战-Join驱动表和被驱动表如何区分

Mysql实战-Join驱动表和被驱动表如何区分 前面我们讲解了Mysql的查询连接Join的算法原理, 我发现大家都知道小表驱动大表,要让小表作为驱动表, 现在有2个问题 查询多表, 到底哪个是驱动表?哪个是被驱动表, 如何区分?索引如何优化,到底是加在驱动表上,还是被驱动表上? &…

k8s 资源预留

KUBERNETES资源管理之–资源预留 Kubernetes 的节点可以按照 Capacity 调度。node节点本身除了运行不少驱动 OS 和 Kubernetes 的系统守护进程&#xff0c;默认情况下 pod 能够使用节点全部可用容量&#xff0c; 除非为这些系统守护进程留出资源&#xff0c;否则它们将与 pod 争…

基于元学习神经网络的类人系统泛化

Nature 上介绍了一个关于AI在语言泛化方面的突破性研究。科学家们创建了一个具有人类般泛化能力的AI神经网络&#xff0c;它可以像人类一样将新学到的词汇融入现有词汇&#xff0c;并在新环境中使用它们。与ChatGPT 相比&#xff0c;该神经网络在系统性泛化测试中表现得更好。 …

视频下载工具Downie4 mac中文支持格式

Downie4 mac是一款视频下载工具。它支持下载各种视频网站上的视频&#xff0c;并且具有快速、稳定、易于使用的特点。 Downie支持下载各种视频网站上的视频&#xff0c;包括YouTube、Vimeo、Netflix、Hulu、Amazon等等。它具有快速、稳定的下载速度&#xff0c;可以帮助用户轻松…

优咔科技创新连接方案助力高质量5G车联服务

上海优咔网络科技有限公司 CEO 闫楠 【摘要】本文就智能网联汽车对高质量5G车联服务的需求背景和行业趋势进行了分析&#xff0c;主要介绍采用5G双SIM卡的创新连接方案&#xff0c;重点讲述双SIM卡联网的端到端体系架构和技术方案&#xff0c;并就优咔科技全方位支撑行业领先车…

分布式:一文吃透分布式事务和seata事务

目录 一、事务基础概念二、分布式事务概念什么是分布式事务分布式事务场景CAP定理CAP理论理解CAPCAP的应用 BASE定理强一致性和最终一致性BASE理论 分布式事务分类刚性事务柔性事务 三、分布式事务解决方案方案汇总XA规范方案1&#xff1a;2PC第一阶段&#xff1a;准备阶段第二…

Linux:Docker的介绍(1)

Docker官网 Docker: Accelerated Container Application Developmenthttps://www.docker.com/ docker是什么&#xff1f; 是一种轻量级的‘虚拟机’ 在Linux容器里运行应用的开源工具 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个…

QT实现在线流媒体播放平台

文章目录 QT实现在线流媒体播放平台简介开发视频ffmpeg下载SimpleVideoPlayer.hSimpleVideoPlayer.cpp 开发音频添加功能打开文件夹播放暂停播放上下一首选择倍速 效果展示项目下载 QT实现在线流媒体播放平台 简介 Qt是一种流行的C开发框架&#xff0c;它提供了用于构建图形用…