Codeforces Ronda # 703 (Div.2) D. Mediana máxima (dos puntos + suma de prefijo)

Título:

Dada una matriz de longitud n, se requiere encontrar un intervalo que satisfaga la longitud mayor o igual que k, y la mediana es la más grande.

responder:

Considere primero las dicotomías, podemos comenzar con el medio medio medio mediom i d , y luego ver si podemos encontrar un intervalo para cumplir con los requisitos. El siguiente procesamiento es más inteligente:

Ponemos ≥ \ geqEl número mid se registra como 1, de lo contrario se registra como -1, entonces se puede encontrar que si la suma de un cierto intervalo es un número positivo, significamid midm i d cumple con los requisitos. Dado queserequiere lasuma deintervalo, se debe requerir lasuma delprefijo, recuerdesum [i] sum [i]s u m [ i ] es la suma del prefijo, siiii es el final del intervalo y el intervalo cumple con los requisitos, entonces el valor máximo del intervalo> 0> 0>0

即 :máximoj = 0 i - k (suma [i] - suma [j])> 0 \ max \ límites_ {j = 0} ^ {ik} (suma [i] -sum [j])> 0j = 0maxi - k( s u m [ yo ]-s u m [ j ] )>0 , porquesuma [i] suma [i]s u m [ i ] no cambia, entonces se requiere el valor máximo, solosuma [j] suma [j]El valor mínimo de s u m [ j ] es suficiente, establezcadp [i] dp [i]d p [ i ] es el prefijo mínimo de lasumadel prefijo, entonces el problema se transforma en lasuma dejuicio[i] - dp [i - k] sum [i] -dp [ik]s u m [ i ]-d p [ i-K ] si> 0> 0>0

Código:

#include<bits/stdc++.h>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
#include<set>
#include<ctime>
#define iss ios::sync_with_stdio(false)
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
typedef pair<int,int>pii;
const int MAXN=2e5+5;
const int mod=1e9+7;
const int inf=0x3f3f3f3f;
int a[MAXN];
int dp[MAXN];
int n,k;
int sum[MAXN];
bool check(int mid)
{
    
    
    for(int i=1;i<=n;i++) dp[i]=1e9;
    for(int i=1;i<=n;i++)
    {
    
    
        if(a[i]>=mid) sum[i]=sum[i-1]+1;
        else sum[i]=sum[i-1]-1;
        dp[i]=min(dp[i-1],sum[i]);
    }
    for(int i=k;i<=n;i++)
    {
    
    
        if(sum[i]-dp[i-k]>0) return true;
    }
    return false;
}
int main()
{
    
    
    cin>>n>>k;
    for(int i=1;i<=n;i++) cin>>a[i];
    int l=1,r=n;
    int ans;
    while(l<=r)
    {
    
    
        int mid=(l+r)>>1;
        if(check(mid))
        {
    
    
            ans=mid;
            l=mid+1;
        }
        else r=mid-1;
    }
    printf("%d\n",ans);
}

Supongo que te gusta

Origin blog.csdn.net/weixin_45755679/article/details/113926668
Recomendado
Clasificación