Codeforces Ronda # 708 (Div. 2) B. Matrices M

B. matrices M

tema

Inserte la descripción de la imagen aquí

Idea general

En una secuencia determinada, vuelva a dividir la subserie de modo que la suma de los elementos adyacentes en cada subsecuencia pueda dividir my el intervalo sea lo más pequeño posible. Pregunte cuántos intervalos se pueden dividir en al menos

Ideas para resolver problemas

No importa cuán grande sea la entrada, el módulo de adición puede ser el módulo del sumando (no es necesario considerar 0), de modo que los diferentes números originales se pueden almacenar en el mismo mapeo, luego al preguntar si la suma de los números pueden tomar el módulo m, es preguntar si el número de mi es 0 a través del mapeo. Si no es 0, la mejor manera es colocar iy mi aparte. Si la diferencia entre los dos números es mayor que 2, entonces debe colocar los elementos adicionales uno por uno en un solo intervalo, si es 0, el número de asignaciones en i debe tomarse como el número de intervalos.

Muestra de entrada

4
6 4
2 2 8 6 9 4
10 8
1 1 1 5 2 4 4 8 6 7
1 1
666
2 2
2 4

Salida de muestra

3
6
1
1

Código de acceso

#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimization ("unroll-loops")
using namespace std;
#define ll long long
#define sl(n) scanf("%lld",&n)
#define pl(n) printf("%lld",n)
#define sdf(n) scanf("%lf",&n)
#define pdf(n) printf("%.lf",n)
#define pE printf("\n")
#define ull unsigned long long
#define pb push_back
#define pre(n) for(ll i=1;i<=n;i++)
#define rep(n) for(ll i=n;i>=1;i--)
#define pi pair<ll,ll>
#define fi first
#define se second
ll a[100010];
int main()
{
    
    
	ll t,n,m,i,j,cnt;
	sl(t);
	while(t--){
    
    
	cnt=0;	
	sl(n),sl(m);
	map<ll ,ll>b;
	pre(n) {
    
    
	sl(a[i]);
	a[i]%=m;
	b[a[i]]++;
	} 
	ll temp[m];
	memset(temp,0,sizeof(temp));
	for(i=0;i<m;i++){
    
    
	if(i==0&&b[i]){
    
    cnt++,b[i]=0,temp[i]=1;continue;}
	if(b[i]&&b[m-i]&&!temp[i]&&!temp[m-i]){
    
    
		if(abs(b[i]-b[m-i])>=2){
    
    
			cnt+=(abs(b[i]-b[m-i]));
		}
		else cnt++;
		temp[i]=temp[m-i]=1;
		b[m-i]=b[i]=0;
	}
	else if(b[i]&&!temp[i]){
    
    
		cnt+=b[i];
		temp[i]=1;
		b[i]=0;
    }
	}
	pl(cnt);
    pE;
    }

	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/m0_46118687/article/details/114973449
Recomendado
Clasificación