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;
}