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;
    }
    
  • 相关阅读:
    Spring-AOP切面编程(3)
    【SpringBoot】SpingBoot整合AOP
    反射--Reflection
    泛型--Generic
    C#系统库的源代码
    C#中的?
    C#语法糖
    C#初识LINQ
    C#委托和事件的区别
    C#中的lambda表达式
  • 原文地址:https://www.cnblogs.com/mollnn/p/14082930.html
Copyright © 2011-2022 走看看