• [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;
    }
    
  • 相关阅读:
    如何在VIM中编辑并保存退出!!!
    MapReduce---数据清洗
    构建之法阅读笔记03
    人月神话阅读笔记03
    学习进度报告16
    大道至简阅读笔记03
    大道至简阅读笔记02
    个人总结
    大道至简阅读笔记01
    学习进度报告15
  • 原文地址:https://www.cnblogs.com/mollnn/p/14082930.html
Copyright © 2020-2023  润新知