Fideos instantáneos (resta + hash)

https://codeforces.com/problemset/problem/1322/C


Blog de referencia: https://blog.csdn.net/jk_chen_acmer/article/details/107296232

Inserte la descripción de la imagen aquí

MCD (a + b + c, b + c + d, a + b + c + d)

Después de ser eliminado y restado, obtenemos: MCD (a, b + c, d)

El análisis puede llevar a una conclusión: para el punto de la derecha, si dos puntos (aquí byc) están conectados al mismo conjunto de puntos (AB), entonces estos dos puntos son del mismo tipo.

El resultado es el mcd de la suma de los pesos internos de todos los puntos.

Y analiza qué puntos son de un tipo y usa hash.


Iluminación: encontré el gcd relacionado e intenté utilizar el método de lanzar y restar.

Por supuesto, cf debe tener un módulo dual. Y cuando la cantidad de entrada de datos es grande, se requiere scanf. Esta vez cf ha bloqueado el cin (apagué el flujo síncrono

Luego, escribir directamente el mapa hash que establece un vector <>, es decir, map<vector<int>, int>el vector se asigna a un número entero.

#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<cstdio>
#include<algorithm>
#define debug(a) cout<<#a<<"="<<a<<endl;
using namespace std;
const int maxn=5e5+100;
typedef long long LL;
typedef pair<LL,LL> p;
LL c[maxn],g[maxn];
const int P=131;
const int mod1=19260817;
const int mod2=19660813;
vector<int>v[maxn];
int main(void)
{
  //cin.tie(0);std::ios::sync_with_stdio(false);
  int t;scanf("%d",&t);
  while(t--)
  {
  	
 // 	pair<LL,LL>p;
  	map<p,LL>map1;
  	int n,m;scanf("%d%d",&n,&m);
  	for(int i=1;i<=n;i++) scanf("%lld",&c[i]),v[i].clear(),g[i]=0;
  	for(int i=1;i<=m;i++){
  		LL x,y;scanf("%d%d",&x,&y);v[y].push_back(x);	
	}
	for(int i=1;i<=n;i++){
		if(!v[i].size()) continue;
		sort(v[i].begin(),v[i].end());
	} 
	for(int i=1;i<=n;i++){
		int hx1=0;int hx2=0;
		if(v[i].size()==0) continue;
		for(int j=0;j<v[i].size();j++)
		{
			hx1=(hx1*P%mod1+v[i][j]%mod1)%mod1;
			hx2=(hx2*P%mod2+v[i][j]%mod2)%mod2;
		}
		p k={hx1,hx2};
		if(!map1[k]) map1[k]=i;
		g[map1[k]]+=c[i];
	}
	LL gcd=0;
	for(int i=1;i<=n;i++) gcd=__gcd(gcd,g[i]);
	printf("%lld\n",gcd);
  }
return 0;
}

 

Supongo que te gusta

Origin blog.csdn.net/zstuyyyyccccbbbb/article/details/108890752
Recomendado
Clasificación