首页 > 其他分享 >CF1852A Ntarsis' Set

CF1852A Ntarsis' Set

时间:2023-08-15 19:12:57浏览次数:37  
标签:Ntarsis Set CF1852A 删除 int mid long ans cur

题目大意

集合 \(S:1,2,3,4,\dots,10^{1000}\)。

给定长度为 \(n\) 的单调递增正整数序列,给定一个数 \(k\)。

对 \(S\) 进行 \(k\) 次删除操作,每次以序列为下标删除最小元素,即每次同时删除集合中第 \(a_1,a_2,\dots,a_n\) 小的元素。

求 \(k\) 次删除操作后 \(S\) 中最小元素。

思路

考虑二分答案。

对于一个数 \(x\),假设删除了 \(y\) 个小于 \(x\) 的数,那么数 \(x\) 的新排名变成 \(x-y\)。

那么我们就枚举 \(k\) 次。对于每一次操作,我们找到最后一个小于等于 \(x\) 的数 \(a_i\) 的下标 \(y\),那么 \(x\) 的新排名就变成了 \(x-y\)。

对于一个数 \(x\),如果它是答案,那么所有小于 \(x\) 的数的排名都会被修改成 \(0\);所有大于 \(x\) 的数的新排名都大于等于 \(1\)。

对于二分的上界,就算 \(a_1,a_2,\dots,a_n\) 是 \(1 \sim n\) 的排列,那么最多也就删掉前面 \(n \times k\) 个数,所以答案一定小于等于 \(n \times k + 1\)。

对于 \(ans\) 的初始值,我们直接设成 \(1\),这样相当于起到了特判的作用。

Code

#include <bits/stdc++.h>
#define ll long long
#define int long long

using namespace std;

int N,K;
int a[200500],ans;

bool Check(ll x) {
    int k = K;
    while(k--) {
        int cur = lower_bound(a + 1,a + N + 1,x) - a;
        if(a[cur] > x || cur > N)
            cur --;
        // ↑ 找到 a 里最后一个小于等于 x 的下标 cur 
        x -= cur;// 删了数后它的新排名 
        if(x <= 0)
            return 0;
    }
    return 1;
}

signed main() {
    ios::sync_with_stdio(false);
    int T = 1;
    while(T--) {
        cin >> N >> K;
        for(int i = 1;i <= N; i++) 
            cin >> a[i];

        int l = 1,r = N * K + 1,ans = 1;
        while(l <= r) {
            int mid = (l + r) >> 1;
            if(Check(mid)) {
                ans = mid;
                r = mid - 1;
            }
            else 
                l = mid + 1;
        }
        cout << ans << "\n";
        for(int i = 1;i <= N; i++)
            a[i] = 0;
    }
  
    return 0;
}

标签:Ntarsis,Set,CF1852A,删除,int,mid,long,ans,cur
From: https://www.cnblogs.com/baijian0212/p/solution-cf1852-a.html

相关文章

  • 无涯教程-Perl - setsockopt函数
    描述此函数将SocketoptionsOPTNAME的值设置为SOCKET上指定级别的OPTVAL值。您需要导入Socket模块,以获取Tabl中显示的OPTNAME的有效值语法以下是此函数的简单语法-setsockoptSOCKET,LEVEL,OPTNAME,OPTVAL返回值如果失败,此函数返回undef;如果成功,则返回1。OPTNAME......
  • 无涯教程-Perl - setpwent函数
    描述此功能将枚举设置(或重置)到密码条目集的开头。应该在第一次调用getpwent之前调用此函数。语法以下是此函数的简单语法-setpwent返回值此函数不返回任何值。例以下是显示其基本用法的示例代码-#!/usr/bin/perlwhile(($name,$passwd,$uid,$gid,$quota,$com......
  • C# 关于setting
    选择应用程序只能在**.config里,而且是只读的修改不了,想修改的话需要改成user,如下图所示:  保存和赋值,如下 注意:应用程序范围设置可存储在machine.config或 app.exe.config文件中。Machine.config始终为只读,而出于安全考虑,app.exe.config对大多数应用程序也限......
  • 无涯教程-Perl - setprotoent函数
    描述该函数应在第一次调用getprotoent之前调用。STAYOPEN参数是可选的,在大多数系统上未使用。当getprotoent()检索协议数据库下一行的信息时,setprotoent会将枚举设置(或重置)为主机条目集的开头。语法以下是此函数的简单语法-setprotoentSTAYOPEN返回值此函数不返回......
  • 无涯教程-Perl - setpriority函数
    描述此函数设置进程(PRIO_PROCESS),进程组(PRIO_PGRP)或用户(PRIO_USER)的优先级。参数WHICH指定要为其设置优先级的实体,WHO是要设置的进程ID或用户ID。WHO的值为0定义了当前流程,流程组或用户。在不支持系统setpriority()函数的系统上产生致命错误。优先级是代表优先级级别......
  • 无涯教程-Perl - setnetent函数
    描述该函数应在第一次调用getnetent之前调用。STAYOPEN参数是可选的,在大多数系统上未使用。当getnetent()从网络数据库的下一行检索信息时,setnetent会将枚举设置(或重置)为主机条目集的开头。语法以下是此函数的简单语法-setnetentSTAYOPEN返回值此函数不返回任何值......
  • 无涯教程-Perl - sethostent函数
    描述该函数应在首次调用gethostent之前调用。STAYOPEN参数是可选的,在大多数系统上未使用。当gethostent()检索主机数据库中下一行的信息时,然后sethostent设置(或重置)枚举到主机条目集的开头。语法以下是此函数的简单语法-sethostentSTAYOPEN返回值此函数不返回任何......
  • Vue3 setup的业务逻辑分离功能拆分
    在Vue3开发中,我们可能遇到一个页面或者组件业务逻辑很复杂,代码量达到千行,不利于阅读和维护,因此需要将业务逻辑进行分离首页主界面index.vue//index.vue<script>import{reactive,toRefs}from'vue'importuseOperatefrom'./useOperate.js'importuseConfi......
  • 关于前端开发中 img 元素的 srcset 属性
    img标签的srcset属性是一种用于响应式网页设计的属性,它允许开发者为图像提供不同大小和分辨率的版本,以便根据设备的屏幕大小和像素密度自动选择最合适的图像进行显示。通过使用srcset属性,可以在不同设备上提供最佳的视觉体验,避免了不必要的图像变形和加载大尺寸图像的性能问......
  • 实践教程|源码级理解Pytorch中的Dataset和DataLoader
    前言 本文30分钟带你达到对Pytorch中的Dataset和DataLoader的源码级理解,并提供构建数据管道的3种常用方式的范例,扫除你构建数据管道的一切障碍。本文转载自算法美食屋作者|梁云1991仅用于学术分享,若侵权请联系删除欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最......