Codeforces Ronda # 668 (Div.2)

Haga las preguntas en los primeros 20 minutos, vea las preguntas después, la segunda pregunta a los luchadores, invente preguntas después del partido www

A - Falsificación de permutación

Salida directa en orden inverso

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std;
int n;
int a[110];
int main()
{
    
    
    IO;
    int T;
    cin>>T;
    while(T--)
    {
    
    
        cin>>n;
        for(int i=0;i<n;i++) cin>>a[i];
        reverse(a,a+n);
        for(int i=0;i<n;i++) cout<<a[i]<<' ';
        cout<<endl;
    }
    return 0;
}

B - Cancelación de matriz

Considere cómo un número negativo en una matriz se convierte en 0 al menos a un costo.
Si no hay un número positivo al frente, se deben gastar monedas; de lo contrario, se compensará con el número positivo al frente. Para que el costo de las monedas compense el último número positivo, simplemente mantenga el prefijo y juegue.

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=100010;
int n;
ll a[N];
ll s[N];
int main()
{
    
    
    IO;
    int T;
    cin>>T;
    while(T--)
    {
    
    
        cin>>n;
        for(int i=1;i<=n;i++) cin>>a[i];
        for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i];
        ll res=0;
        for(int i=1;i<=n;i++)
            if(a[i]<0) res-=min(0ll,s[i-1]+res+a[i]);
        cout<<res<<endl;
    }
    return 0;
}

C - Bitstring equilibrado

No he resuelto esta pregunta. Después del juego, miré la solución y pensé en ella por un tiempo. Soy tan bueno.
Considere la longitud de kkLa ventana de k se mueve sobre la cadena original, y la ventanas [i] s [i]muestra el carácter frontal durante el movimiento.s [ i ] , agrega un carácter nuevos [i + k] s [i + k]s [ i+k ] , si quiere asegurarse de que1 1 en laventanaNúmero de 1 y0 0El número de 0 permanece sin cambios, entoncess [i] = s [i + k] s [i] = s [i + k]s [ i ]=s [ i+k ] , si se cumplen las condiciones anteriores, se puede garantizar que todas las longitudes sonkksubcadena de k 1 1Número de 1 y0 0El número de 0 es igual,1 1 en laprimera ventana solo necesita ser juzgadoNúmero de 1 y0 0¿ El número de 0 no es mayor quek 2 \ frac {k} {2}2kPoder

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std;
const int N=300010;
int n,k;
int a[N];
int main()
{
    
    
    IO;
    int T;
    cin>>T;
    while(T--)
    {
    
    
        cin>>n>>k;
        for(int i=0;i<=n;i++) a[i]=-1;
        string s;
        cin>>s;
        bool ok=1;
        for(int i=0;i<n;i++)
        {
    
    
            int j=i%k;
            if(s[i]=='?') continue;
            else
            {
    
    
                if(a[j]==-1)
                    a[j]=s[i]-'0';
                else
                {
    
    
                    if(a[j]!=s[i]-'0')
                        ok=0;
                }
            }
        }
        if(ok)
        {
    
    
            int cnt0=0,cnt1=0;
            for(int i=0;i<k;i++) 
                cnt0+=a[i]==0,cnt1+=a[i]==1;
            if(cnt0>k/2||cnt1>k/2) ok=0;
        }
        if(ok) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    return 0;
}

D - Etiqueta de árbol

La condición necesaria y suficiente para que Bob gane
① La dist inicial (a, b)> da dist (a, b)> dad i s t ( a ,b )>
Si no se cumple d a , el primer paso puede ser directamente hasta el punto donde b es
② El diámetro del árbol> 2 × da> 2 × da>2×
Si d a no se satisface, a puede encontrar una manera de saltar al centro del árbol y luego llegar a cualquier punto dentro de un paso
db> 2 × da db> 2 × dad b>2×
Si d a no está satisfecho, cada vez que a intenta mantener la distancia entre ayb, entonces b debe seguir alejándose de a. Cuando sabe que no puede estar lejos, no puede saltar fuera del rango y luego perder.
Es muy difícil pensar en ello, todos los dioses inventan

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
const int N=100010;
int n,a,b,da,db;
int h[N],e[N*2],ne[N*2],idx;
int dep[N];
int dlen;
void add(int a,int b)
{
    
    
    e[idx]=b;
    ne[idx]=h[a];
    h[a]=idx++;
}
int dfs1(int u,int fa)//树的直径
{
    
    
    int d1=0,d2=0;
    for(int i=h[u];i!=-1;i=ne[i])
    {
    
    
        int j=e[i];
        if(j==fa) continue;
        int d=1+dfs1(j,u);
        if(d>d1) d2=d1,d1=d;
        else if(d>d2) d2=d;
    }
    dlen=max(dlen,d1+d2);
    return d1;
}
void dfs2(int u,int fa)//求初始的dist(a,b)
{
    
    
    dep[u]=dep[fa]+1;
    for(int i=h[u];i!=-1;i=ne[i])
    {
    
    
        int j=e[i];
        if(j==fa) continue;
        dfs2(j,u);
    }
}
int main()
{
    
    
    IO;
    int T;
    cin>>T;
    while(T--)
    {
    
    
        cin>>n>>a>>b>>da>>db;
        for(int i=1;i<=n;i++) h[i]=-1,dep[i]=0;
        idx=0;dlen=0;
        for(int i=1;i<n;i++) 
        {
    
    
            int a,b;
            cin>>a>>b;
            add(a,b),add(b,a);
        }
        dfs1(1,0);
        dfs2(a,0);
        int dist=dep[b]-dep[a];
        if(dist>da&&dlen>2*da&&db>2*da) cout<<"Bob"<<endl;
        else cout<<"Alice"<<endl;
    }
    return 0;
}

Vamos ~

Supongo que te gusta

Origin blog.csdn.net/Fighting_Peter/article/details/108444671
Recomendado
Clasificación