首页 > 其他分享 >The Median of the Median of the Median

The Median of the Median of the Median

时间:2024-09-18 09:24:59浏览次数:6  
标签:qxiao qda int Median tot val1

  • 难以直接求解。考虑用二分答案转化为判定(根据复杂度理论,判定的难度小于求解)。
  • 当你想不到一个更新的视角看待问题时,不妨回顾一下你已有的想法,正解说不定就隐藏其中,只需要再深入一些
点击查看代码
#include <bits/stdc++.h>
using namespace std;
int a[2005],b[2005][2005],v[2][2005][2005];
priority_queue<int>qxiao;
priority_queue<int,vector<int>,greater<int> >qda;
int len;
void clear()
{
    len=0;
    while(qxiao.size())
    {
        qxiao.pop();
    }
    while(qda.size())
    {
        qda.pop();
    }
}
void update(int x)
{
    if(len%2==0)
    {
        if(qda.empty()||x<=qda.top())
        {
            qxiao.push(x);
        }
        else
        {
            qxiao.push(qda.top());
            qda.pop();
            qda.push(x);
        }
    }
    else
    {
        if(qxiao.empty()||x>=qxiao.top())
        {
            qda.push(x);
        }
        else
        {
            qda.push(qxiao.top());
            qxiao.pop();
            qxiao.push(x);
        }
    }
    len++;
}
int main()
{
    int n;
    cin>>n; 
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    for(int i=1;i<=n;i++)
    {
        clear();
        for(int j=i;j<=n;j++)
        {
            update(a[j]);
            b[i][j]=qxiao.top();
        }
    }
    int l=1,r=1000000000;
    while(l<r)
    {
        int mid=(l+r)>>1;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                v[0][i][j]=v[0][i-1][j]+v[0][i][j-1]-v[0][i-1][j-1];
                v[1][i][j]=v[1][i-1][j]+v[1][i][j-1]-v[1][i-1][j-1];
                if(i>j)
                {
                    continue;
                }
                v[0][i][j]+=(b[i][j]<=mid);
                v[1][i][j]+=(b[i][j]>=mid);
            }
        }
        int val0=0,val1=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=i;j<=n;j++)
            {
                int v0=v[0][j][j]-v[0][i-1][j]-v[0][j][i-1]+v[0][i-1][i-1];
                int v1=v[1][j][j]-v[1][i-1][j]-v[1][j][i-1]+v[1][i-1][i-1];
                int m=j-i+1;
                int tot=m*(m-1)/2+m;
                val0+=(v0>=(tot+1)/2);
                val1+=(v1>=tot-(tot+1)/2+1);
            }
        }
        if(val0>=val1)
        {
            r=mid;
            int tot=n*(n-1)/2+n;
            if(val0>=(tot+1)/2&&val1>=tot-(tot+1)/2+1)
            {
                cout<<mid<<endl;
                return 0;
            }
            r--;
        }
        else
        {
            l=mid;
            int tot=n*(n-1)/2+n;
            if(val0>=(tot+1)/2&&val1>=tot-(tot+1)/2+1)
            {
                cout<<mid<<endl;
                return 0;
            }
            l++;
        }
    }
    cout<<l<<endl;
    return 0;
}

标签:qxiao,qda,int,Median,tot,val1
From: https://www.cnblogs.com/watersail/p/18417930

相关文章

  • Atcoder [AGC006D] Median Pyramid Hard 题解 [ 紫 ] [ 二分 ] [ adhoc ]
    MedianPyramidHard:二分trick加上性质观察题。trick我们可以二分值域,然后把大于等于它的数标记成\(1\),其他标记为\(0\)(有些题需要标记成\(-1\)),然后根据这个来check方案是否可行,这通常通过判断某个数是否是\(1\)来实现。本质上其实就是check大于等于它的数能否成为......
  • F. Expected Median(组合数学,模板)
    题目来源:https://codeforces.com/contest/1999/problem/F//题意:给长度为n的01字符串,求每个长度为k的子序列串(不连续)的中位数总和。//思路:n的范围为2e5,“我也不会非暴力求所有子序列啊”。先理解下什么是中位数吧,就是对于有序的中间数字,奇数就是(k+1)/2。也只有中位数是1的子序列......
  • AGC022E Median Replace
    传送门题意:给定长度为奇数的01?串,问多少种填法使得串可以变成\(1\)。一次操作定义为把连续三个数变成它们的中位数。这种计数题可以先考虑怎么判定一个串是否可以变成\(1\),称作合法。根据人类智慧,可以想到\(000S\)合法\(\iff\)\(0S\)合法,进而启示我们考虑串\(S\)的......
  • CF1999F.Expected Median 题解
    一.前言这是一道很有趣的数学题目,用到了逆元和组合数学,非常适合新手练手。二.题目大意:给出一个长度为\(n\)的\(01\)数组。找出所有长度为\(k\)的子序列的中位数,求出其和。妥妥的数学题~三.分析首先考虑对答案的贡献。很明显,只有\(1\)作为中位数时才会做出贡献,于是......
  • 题解:CF1349B Orac and Medians
    洛谷|CF刷一些CF2000,进行一个录的记。思路记录首先观察到数列里的数不能凭空产生,所以初始序列必须含\(k\)。由于两个数的中位数是较小的那个,所以只要有一个与数列里的\(k\)相邻且比\(k\)大的数,就可以扩展到整个序列。发现可以把第二条推广一下,不必要和\(k\)相邻,因......
  • [题解]AT_abc236_e [ABC236E] Average and Median
    思路直接将输出的答案分为两个分考虑。(1)考虑二分+DP。设当前二分出的平均数为\(x\),如果合法,那么有(其中\(p\)为选出数下标的集合):\[\frac{a_{p_1}+a_{p_2}+\dots+a_{p_k}}{k}\geqx\]即:\[\frac{(a_{p_1}-x)+(a_{p_2}-x)+\dots+(a_{p_......
  • [ABC107D] Median of Medians 题解
    题目大意:一个长度为$M$的序列的中位数为这个序列从小到大排序后第$\lfloor\fracM2\rfloor+1$个数,将这个序列的所有子段的中位数放入一个序列中,求这个序列的中位数。设一个序列$a$的中位数为$x$,那么$a$中至少会有一半的数大于等于$x$,并且$x$是$a$中满足这个条件......
  • 解决方案 | 获取所有的打印输出的图纸尺寸的名称GetCanonicalMediaNames返回为空的原
     巨大的坑,该代码来自于acadauto_2014--AutoCAD2014ActiveXReferenceGuide.chm但是存在一个巨大的bug。'获取所有的打印输出的图纸尺寸的名称,但是事前必须设置【打印机对象】也就是Layouts("Model").ConfigName="DWFClassic.pc3"这样的代码,否则返回为空。也就是说,先设......
  • AtCoder Grand Contest 022 E Median Replace
    洛谷传送门AtCoder传送门考虑对于一个确定的串怎么判断合法性。容易发现删到某个时刻若\(1\)的个数大于\(0\)的个数了,因为我们肯定不会蠢到在不是全\(1\)的时候删\(111\),所以\(c_1-c_0\)在不是全\(1\)的时候至少是不会变小的。所以我们的目标就是让\(c_1-c_0......
  • Solution - Median Sum
    其它题不是很写得动了跑来写一下这个题,还是挺有趣的。给定由\(n\)个正整数\(a_1,a_2,\dots,a_n\)组成的可重集合,求出它的非空子集的和的中位数。设\(sum=\sum\limits_{i=1}^na_i\)。首先是对于任意一个子集,设其和为\(x\),我们将其取反,就是选的改成不选,不选的改......