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 ∑(ai−x)≥0
可以dp。
第二问同理,二分答案 x x x,然后 b i = [ a i ≥ x ] b_i = [a_i\\ge x] bi=[ai≥x]
那么就是 ∑ b i ≥ 0 \\sum b_i\\ge 0 ∑bi≥0
也是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(二分)