Codeforces Ronda 896 (Div. 2)

Panel de control - Codeforces Ronda 896 (Div. 2) - Codeforces

A. Hazlo cero

Si lo piensas bien, encontrarás que si la longitud es un número par, puedes realizar dos operaciones. La primera vez cambiará todos los números al mismo número y XOR estos mismos números. Dado que la longitud es un número par , el resultado final será 0. Si la longitud es un número impar, simplemente realice 4 operaciones. La primera operación es cambiar los primeros n - 1 números a 0. Finalmente, hay un número que no ha cambiado a 0. Puede combinar ese número con el 0 anterior. para formar un número par. Transformar

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
void solve()
{
	int n, a[N], l[N], r[N], ans, cnt;
	ans = 0, cnt = 0;
	cin >> n;
	for(int i = 1; i <= n; i ++)cin >> a[i];
	if((n % 2) == 0)
	{
		cout << 2 << '\n';
		cout << 1 << ' ' << n << '\n';
		cout << 1 << ' ' << n << '\n';
	}
	else
	{
		cout << 4 << '\n';
		cout << 1 << ' ' << n - 1 << '\n';
		cout << 1 << ' ' << n - 1 << '\n';
		cout << n - 1 << ' ' << n << '\n';
		cout << n - 1 << ' ' << n << '\n';
	}
}
int main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int t;
	cin >> t;
	while(t --)
	{
		solve();
	}
	return 0;
}

B. Viajes 2D

Se puede ver que si no hay una gran ciudad, el costo mínimo de a a b es a a b. Si hay una gran ciudad entre ab, el costo mínimo de a a b es el costo de a a la gran ciudad más el costo de b a la gran ciudad más el costo de a a b. Tome el costo mínimo

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5 + 10, inf = 0x3f3f3f;
pair<ll, ll> p[N];
#define x first
#define y second 
void solve()
{
	int n, k, a, b;
	cin >> n >> k >> a >> b;
	for(ll i = 1; i <= n; i ++)
	{
		cin >> p[i].x >> p[i].y;
 	}
 	ll dis1 = 1e18, dis2 = 1e18;
 	for(ll i = 1; i <= k; i ++)
 	{
 		dis1 = min(dis1, abs(p[i].x - p[a].x) + abs(p[i].y - p[a].y));
		dis2 = min(dis2, abs(p[i].x - p[b].x) + abs(p[i].y - p[b].y));
	}

	cout << min(dis1 + dis2, abs(p[a].x - p[b].x) + abs(p[a].y - p[b].y)) << '\n';
}
int main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int t;
	cin >> t;
	while(t --)
	{
		solve();
	}
	return 0;
 } 

C. Complete la matriz

Por el significado de la pregunta, sabemos que cada fila está completamente organizada y que cada columna tiene un número que no puede aparecer. Para escalonar estos números, puede desplazar los números de una columna hacia la izquierda a la vez. Si el valor de la respuesta Se ha realizado, puede simplemente escribir los otros números al azar, especialmente Se juzga que cuando m == 1, el valor mínimo de esta columna también es 0 y no hay resultado, por lo que se genera 0.

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
void solve()
{
	int n, m, a[N];
	cin >> n >> m;
	if(m == 1)
	{
		cout << 0 << '\n';
		for(int i = 1; i <= n; i ++)
		{
			for(int j = 1; j <= m; j ++)
			{
				cout << 0 << ' ';
			}
			cout << '\n';
		}
		return;
	}
		int ans = min(n + 1, m);
		cout << ans << '\n';
		int cnt = 0;
		for(int i = 0; i < m; i ++)a[i] = i;
		int k = n;
		while(k --)
		{
			for(int i = cnt; i < m; i ++)
			{
				cout << a[i] << ' ';
			}
			for(int j = 0; j < cnt; j ++)
			{
				cout << a[j] << ' ';
			}
			cout << '\n';
			if(cnt < m - 2)cnt ++;
		}
	
}
int main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int t;
	cin >> t;
	while(t --)
	{
		solve();
	}
	return 0;
}

D1. Fiesta de dulces (versión fácil)

Todos deben dar y recibir dulces, y la cantidad final de dulces de todos debe ser la misma.

Si todos tienen el mismo número de caramelos, entonces este número es el promedio. Si el número de caramelos es el promedio al principio, no hay necesidad de cambiar, porque los caramelos se pueden repartir y devolver, y todavía habrá Al final no habrá ningún cambio.

Sea suma la suma de toda la matriz. Solo cuando suma % n == 0, hay una solución legal. Sea avg el promedio. Sea d = vag - x la diferencia entre este número y el promedio. Dado que todos necesita tomar un caramelo y todos tienen que dar un caramelo, por lo que para todos definitivamente cambiaremos como, por lo que para que x se convierta en vag, debe estar satisfecho , y esa respuesta es única, ( Los resultados obtenidos al restar dos Las potencias cuadráticas nunca volverán a ser las mismas.

Dado que todos recibirán dulces de exactamente una persona y le darán dulces a exactamente una persona, asumimos que si una determinada persona necesita recibir x dulces y dar x dulces para lograr el promedio, entonces debe haber una persona que dé un dulce correspondiente a una persona que recibe un caramelo.

Para cada elemento x, encontramos el correspondiente (j, k) que satisface la ecuación anterior y contamos las apariciones pares e impares de cada potencia cuadrática. Si una potencia cuadrática aparece un número impar de veces, es ilegal.

Código aprobado parcialmente: (no estoy seguro de cuál es el problema)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5 +10;
ll n, a[N], cnt[65];
void solve()
{
	ll sum = 0;
	cin >> n;
	for(ll i = 1; i <= n; i ++)
	{
		cin >> a[i];
		sum += a[i];
	}
	if(sum % n)
	{
		cout << "NO" << '\n';
		return;	
	}
	ll vag = sum / n, flag = 0;
	for(ll i = 1; i <= n; i ++)
	{
		ll st = 0;
		for(ll j = 0; j <= 60; j ++)
		{
			for(ll k = 0; k <= 60; k ++)
			{
				if(a[i] + (1ll << j) - (1ll << k) == vag)
				{
					st = 1,cnt[j] ^= 1, cnt[k] ^= 1;
				}
			}
		}
		if(!st)flag = 1;
	}
	for(ll i = 0; i <= 60; i ++)
	{
		if(cnt[i] > 0)flag = 1;
		cnt[i] = 0;
	}
	if(flag)cout << "NO" << '\n';
	else cout << "YES" << '\n';
}
int main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	ll t;
	cin >> t;
	while(t --)
	{
		solve();
	}
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/m0_75087931/article/details/132810972
Recomendado
Clasificación