E - Average and Median(二分)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了E - Average and Median(二分)相关的知识,希望对你有一定的参考价值。

E - Average and Median(二分)

第一问二分答案 x x x,然后可以所有数 − x -x x,那么就是在要求下满足 ∑ ( a i − x ) ≥ 0 \\sum (a_i-x)\\ge 0 (aix)0

可以dp。

第二问同理,二分答案 x x x,然后 b i = [ a i ≥ x ] b_i = [a_i\\ge x] bi=[aix]

那么就是 ∑ b i ≥ 0 \\sum b_i\\ge 0 bi0

也是dp。

时间复杂度: O ( n l o g V ) O(nlogV) O(nlogV)

难点就是在于一开始没想到 二分后怎么快速算。原来可以dp。

#include <bits/stdc++.h>
using namespace std;

#define endl '\\n'
#define inf 0x3f3f3f3f
#define mod 1000000007
#define m_p(a,b) make_pair(a, b)
#define mem(a,b) memset((a),(b),sizeof(a))
#define io ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)

typedef long long ll;
typedef pair <int,int> pii;

#define MAX 300000 + 50
int n, m, k;
int tr[MAX];
double dp[MAX][2];

bool check1(double mid)
    dp[0][0] = dp[0][1] = 0.0;
    for(int i = 1; i <= n; ++i)
        dp[i][0] = dp[i - 1][1];
        dp[i][1] = max(dp[i - 1][0], dp[i - 1][1]) + tr[i] - mid;
    
    if(max(dp[n][1], dp[n][0]) >= 0)return true;
    else return false;

bool check2(int mid)
    dp[0][0] = dp[0][1] = 0;
    for(int i = 1; i <= n; ++i)
        dp[i][0] = dp[i - 1][1];
        dp[i][1] = max(dp[i - 1][0], dp[i - 1][1]) + (tr[i] >= mid ? 1 : -1);
    
    if(max(dp[n][1], dp[n][0]) > 0)return true;
    else return false;



void work()
    cin >> n;
    for(int i = 1; i <= n; ++i)cin >> tr[i];
    double l = 0, r = 1000000000.0;
    while (r - l >= 1e-6) 
        double mid = (l + r) / 2;
        if(check1(mid))l = mid;
        else r = mid;
    
    int ll = 0, rr = 1000000000;
    while (ll <= rr) 
        int mid = (ll + rr) / 2;
        if(check2(mid))ll = mid + 1;
        else rr = mid - 1;
    
    cout << r << '\\n' << rr << endl;


int main()
    io;
    work();
    return 0;


以上是关于E - Average and Median(二分)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces 1360H - Binary Median (二分)

Leetcode 4. Median of Two Sorted Arrays(二分)

POJ 3579 Median 二分+思维

POJ-3579 Median---二分第k大(二分套二分)

POJ3579 Median —— 二分

Median