zoukankan      html  css  js  c++  java
  • [CF1370D] Odd-Even Subsequence

    Description

    给定长度为 (n) 的数列,在其所有长度为 (k) 的子序列中,求最小的权值是多少。一个子序列的权值定义为其奇数位置最大值和偶数位置最大值之间的最小值。

    Solution

    考虑二分答案,现在如果我们要求这个最小值 (le mid),也就是要求两个最大值中至少有一个 (le mid)

    因此检验时,我们只需要分别检查一遍奇数和偶数的情况即可。

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long 
    const int N = 1000005;
    
    signed main()
    {
        ios::sync_with_stdio(false);
    
        int n,k;
        cin>>n>>k;
    
        vector <int> a(n+3);
    
        for(int i=1;i<=n;i++) cin>>a[i];
    
        int l=0,r=1e9;
    
        while(l<r)
        {
            int mid=(l+r)/2;
    
            int cnt1=0,cnt2=0;
    
            for(int i=1;i<=n;i++)
            {
                if(a[i]<=mid) 
                {
                    ++cnt1;
                    ++i;
                    if(i>n && (k^1)&1) --cnt1;
                }
            }
    
            for(int i=2;i<=n;i++)
            {
                if(a[i]<=mid) 
                {
                    ++cnt2;
                    ++i;
                    if(i>n && k&1) --cnt2;
                }
            }
    
            if(cnt1>=(k+1)/2 || cnt2>=k/2)
            {
                r=mid;
            }
            else 
            {
                l=mid+1;
            }
        }
    
        cout<<l<<endl;
    }
    
  • 相关阅读:
    vue Ant Design 树形控件拖动限制
    defineProperty介绍及使用
    webpack 配置入门
    vscode 插件
    解决输入框自动填充账号密码的问题
    css 动画
    vue按钮权限控制
    git操作
    TCP和UDP的区别
    通信协议 HTTP TCP UDP
  • 原文地址:https://www.cnblogs.com/mollnn/p/14082930.html
Copyright © 2011-2022 走看看