CF Ronda # 625

CF Ronda # 625

A. Agua ~

B. matemáticas

Significado de las preguntas:

Se le dio dos longitud n, m cadenas A, B, están constituidos por la 0,1

Cada elemento de la matriz A ij de = A I * B J

Ahora k dada, y se le preguntó ¿cuántos de la matriz de sub-matriz de tal manera que todos los elementos de la sub-matriz es 1, y el número es sólo 1 k

ideas:

Esta pregunta parece difícil, pero poco análisis, no es difícil de encontrar, están pidiendo k es un área, entonces el área debe hacerse siempre por la composición de ancho, en otras palabras, por eso, quieren ahora es el desmantelamiento de dos k número entero tal que k = m * (k / m), a continuación, a la sub-matriz son todos 1, a continuación, vamos a hacer nada más que la longitud o anchura son ambos 1.

pregunta Mirando luego se transformó en una longitud de 1 m de la sub-secuencia consecutiva, en busca de una longitud B de K / M 1 sub-secuencia consecutiva, de acuerdo con el principio de la multiplicación, multiplicando en A.

A continuación, la cuestión clave se convierte en la longitud k, una cadena continua de número de sub-1

O enfoque n-barrido es de izquierda a derecha de nuevo, e inicializar la cur = 0, se encontró con 1, cur ++, savea [cur ] ++; encontrado 0, cur = 0;

Después del tratamiento, el barrido de derecha a izquierda de nuevo, savea [i-1] + = savea [i], con el propósito de hacerlo en el análogo de entender, en Guardar todo [x] es el número x de la longitud


#include<iostream>
#include<cstring>
#include<cmath> 
using namespace std;
#define INF 1e10+5
#define MAXN 50010
#define MINN -105
typedef long long int LL;
int main()
{   
    LL n,m,k;
    LL a[MAXN],b[MAXN],savea[MAXN],saveb[MAXN];
    memset(savea,0,sizeof(savea));
    memset(saveb,0,sizeof(saveb));
    cin>>n>>m>>k;
    LL cur=0;
    for(LL i=1;i<=n;i++)
    {
        cin>>a[i];
        if(a[i])cur++;
        else cur=0;
        savea[cur]++;
    }
    for(LL i=n;i>=2;i--)
        savea[i-1]+=savea[i];
    cur=0;
    for(LL i=1;i<=m;i++)
    {
        cin>>b[i];
        if(b[i])cur++;
        else cur=0;
        saveb[cur]++;
    }
    for(LL i=m;i>=2;i--)
        saveb[i-1]+=saveb[i];
    LL ans=0;
    for(LL i=1;i<=k;i++)
    {
        if(i>n)break;
        if((k/i)>m)continue;
        if(k/i*i==k)
            ans+=savea[i]*saveb[k/i];
    }
    cout<<ans<<endl;
    return 0;
}

C. simulación

Esta pregunta es muy importante entender el significado del título, que es dar una serie de ( e ) recuperar, preguntará cuánto tiempo la longitud mínima de la operación, haciendo paréntesis coincidentes correctas. Cada operación puede arbitrariamente cambiar el orden de la longitud.

Ideas: En primer lugar, sólo puede invertir el orden, es decir, el número de "(" y ")" para ser el mismo, y en segundo lugar, se barre de izquierda a derecha, para registrar el número actual (si es positivo, lo que indica que (relación) y más la cantidad, es decir, el tiempo que se puede compensar completamente el positivo, si es negativo, entonces para grabar te, una sección para el intercambio es larga, una vez a == 0, entonces se actualizarían años, te vacía

#include<iostream>
#include<cstring>
#include<string>
using namespace std;
#define INF 1e10+5
#define MAXN 105
#define MINN -105
typedef long long int LL;
int main() 
{
    int n ;
    string s ;
    cin>>n>>s;
    int c=0,to=0,te=0,ans=0;
    for(int i=0;i<n;++i)(s[i]==')')?--c:++c ;
    if(c){cout<<-1<<endl;return 0;}
    for(int i=0;i<n;++i)
    {
        if(s[i]=='(')
        {
            if(to<0)te++;
            to++;
        }
        else to--;
        if(to==0)ans+=(te*2),te=0;
    }
cout<<ans<<endl;
}

Supongo que te gusta

Origin www.cnblogs.com/et3-tsy/p/12444747.html
Recomendado
Clasificación