zoukankan      html  css  js  c++  java
  • [2017CCPC哈尔滨]B. K-th Number

    题意是给你一个长度为N的数组,你在每个长度大于等于K的连续区间里,取出第K大的数,组成一个新数组。问新数组中第M大的数是什么。

    这道题最最重要的就是,尺取法可以求出第k大的数大于等于x的区间数。

    为什么可以呢?假设我们尺取法已经取到了K个大于等于x的数的区间,当我们右指针往后移动的时候,新加入的数对这个区间产生的贡献无非两种:

    1. 使第K大的数变大

    2. 第K大的数不变

    我们发现这两种贡献都是不影响我们定义的第k大的数大于等于x区间。于是我们就只需要不断计算每个左区间开始的,符合条件的区间数即可。

    之后我们讲一讲二分是怎么二分的。首先给出答案,二分这个X是什么。即二分答案。

    为什么可以呢?首先我们发现,当X变大的时候,符合条件的区间数会减小,而X变小的时候,符合条件的区间数会变大。这个条件是满足单调性的。所以可以二分。

    那么怎么二分呢?我们需要找的是,新数组中第M个数,这就说明大于X的区间起码要有M-1个,大于等于X的区间起码要有M个。

    于是我们就得到了二分最终位置。

    下面给出AC代码,注意有一个坑点就是M有可能是大于int的。

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef pair<int, int> pii;
    const int inf = 0x3f3f3f3f; ///1061109567
    const int maxn = 2e6 + 10;
    
    ll n, k, m, a[maxn];
    
    ll cal(ll x) {
        ll L = 1, cnt = 0;
        ll ans = 0;
        for (ll R = 1; R <= n; ++ R) {
            if (a[R] >= x) cnt ++;
            while (L <= R && cnt >= k) {
                ans += (n-R+1);
                if (a[L] >= x) cnt --;
                L ++;
            }
        }
    //    cout << x << " " << ans << endl;
        return ans;
    }
    
    int main() {
        int T; scanf("%d", &T);
        while (T--) {
            scanf("%lld%lld%lld", &n, &k, &m);
            for (int i = 1; i <= n; ++ i) {
                scanf("%lld", &a[i]);
            }
            ll L = 1, R = 1e18, ans = 1;
            while (L <= R) {
                ll mid = L + R >> 1;
                if (cal(mid) < m) {
                    R = mid - 1;
                }
                else {
                    ans = max(ans, mid);
                    L = mid + 1;
                }
            }
    //        cout << cal(2) << endl;
            printf("%lld
    ", ans);
        }
        return 0;
    }
  • 相关阅读:
    Airtest操作多台云手机,进行分发,多个脚本后端调度
    Airtest常见的元素定位不到
    pythonDES加密与解密以及hex输出和bs64格式输出
    adb命令将抓包工具证书从用户目录移动至系统目录,解决反爬对于本地证书认证
    解决appium每次app启动时候已登入账号会登出
    PHP数组循环遍历的几种方式
    TP5.1/TP框架的访问控制,访问不存在的模块、控制器、方法等控制
    PHP常用数组函数
    TP5截取部分字符串
    apache虚拟主机配置及解析
  • 原文地址:https://www.cnblogs.com/Vikyanite/p/15422055.html
Copyright © 2011-2022 走看看