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 ~