mémo de programmation du concours java

J'ai résumé le code qui est souvent utilisé lors de la programmation de concours avec java. Comparé au C ++, il y a moins de gens qui font de la programmation compétitive en java et moins d'informations, donc j'ai créé cet article. On suppose que seule la bibliothèque standard sera utilisée.

Code de base

Avant le début du concours, le code est préparé comme suit.

import java.util.*;
public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		System.out.println();
	}
}

Il est également défini comme suit.

static int MOD = 1000000007;
static int INF = Integer.MAX_VALUE;

contribution

Entrée du tableau

En utilisant Arrays.setAll, vous pouvez écrire plus clairement qu'en utilisant l'instruction for.

int[] a = new int[N];
Arrays.setAll(a, i -> sc.nextInt());

Entrée d'arbre

La liste montre quel nœud a une branche à partir de quel nœud.

List<Integer>[] edge = new ArrayList[N];
for(int i = 0; i < N; i++)
	edge[i] = new ArrayList<>();
for (int i = 0; i < N-1; i++) {
    int a = sc.nextInt()-1;
    int b = sc.nextInt()-1;
    edge[a].add(b);
    edge[b].add(a);
}

Entrer dans un arbre avec une commande sur les branches

Si vous avez besoin de l'ordre des branches comme information, par exemple lorsque vous avez besoin de la sortie, créez votre propre classe et enregistrez-les dans HashMap. Problème supposé: ABC146D Coloration des bords sur l'arbre

static int N;
static Map<Integer, HashSet<edge>> m = new HashMap<>();
static class edge{
	int to, id;
	edge(int to, int id){
		this.to = to;
		this.id = id;
	}
}
public static void main(String[] args) {
	for(int i = 0; i < N-1; i++) {
		int a = sc.nextInt();
		int b = sc.nextInt();
		if(!m.containsKey(a))
			m.put(a, new HashSet<>());
		m.get(a).add(new edge(b, i));
	}
}

Diverses méthodes

recherche peu complète

Lorsque N est petit (N <20), recherchez les 2 ^ N voies.

boolean[] x = new boolean[N];
for(int i = 0; i < 1<<N; i++) {
	for(int j = 0; j < N; j++) {
		if ((1 & i >> j) == 1)
			x[j] = true;
		else
			x[j] = false;
	}
}

Distance d'un point dans le graphique

Stocker la distance d'un nœud v dans le tableau d en utilisant la recherche de priorité de largeur

int[] d = new int[N+1];
Arrays.fill(d, INF);
d[v] = 0;
Queue<Integer> q = new ArrayDeque<>();
for(int i : edge.get(v)) {
	q.offer(i);
	d[i] = 1;
}
while(q.size() > 0) {
	int x = q.poll();
	for(int i : edge.get(x)) {
		if(d[i] > d[x] + 1) {
			d[i] = d[x] + 1;
			q.offer(i);
		}
	}
}

Diverses méthodes

Valeur maximale / minimale du tableau

Il peut être obtenu avec des tableaux sans tourner l'instruction for.

Arrays.stream([Nom de la séquence]).min().getAsInt()
Arrays.stream([Nom de la séquence]).max().getAsInt()

Multiple commun minimum

Exprimez la méthode de division mutuelle euclidienne avec une fonction récursive.

public static int gcd(int a, int b) {
		return b == 0 ? a: gcd(b, a % b);
}

Engagement maximum

Utilisez le plus petit multiple commun.

public static int lcm(int a, int b) {
		return a / gcd(a, b) * b;
}

Étage n!

C'est la base des fonctions récursives.

public static long factorial(long n){
	  return n <= 0 ? 1 : n * factorial(n-1);
}	

Combinaison nCr

Prenons le cas de la sortie du reste divisé par 10 ^ 9 + 7 lors de la recherche de la combinaison. Lorsque N est petit (environ <2000), il peut être calculé par la méthode de programmation dynamique en considérant le triangle de Pascal.

int MAX = 2000;
long[][] com = new long[MAX][MAX];
for(int i = 0; i < MAX; i++)
	com[i][0] = 1;
for(int i = 1; i < MAX; i++) {
	for(int j = 1; j <= i; j++) {
		com[i][j] = com[i-1][j-1] + com[i-1][j];
		com[i][j] %= MOD;
	}
}

Si N est grand, il est nécessaire de trouver l'élément inverse. Le calcul est effectué en appelant COMinit () dans la méthode principale, et nCr peut être obtenu par combinaison (n, r).

public static int MOD = 1_000_000_007;
public static int MAX = 100000;
public static long[] fac = new long[MAX];
public static long[] finv = new long[MAX];
public static long[] inv = new long[MAX];
	
public static void COMinit() {
	fac[0] = fac[1] = 1;
	finv[0] = finv[1] = 1;
	inv[1] = 1;
	for(int i = 2; i < MAX; i++) {
		fac[i] = fac[i-1] * i % MOD;
		inv[i] = MOD - inv[MOD%i] * (MOD/i) % MOD;
		finv[i] = finv[i-1] * inv[i] % MOD;
	}
}

public static long combination(int n, int k){
	if(n < k || n < 0 || k < 0) return 0;
	return fac[n] * (finv[k] * finv[n-k] % MOD) % MOD;
}
public static void main(String[] args) {
	COMinit();
	System.out.println(combination(2000, 3));
}

Sortie de séquence complète

Sort toutes les séquences dans N! Street.

static List<String> z;
	
public static void permutation(String q, String ans){
	if(q.length() <= 1) {
		z.add(ans + q);
	 }
	 else {
	    	for (int i = 0; i < q.length(); i++) {
	    		permutation(q.substring(0, i) + q.substring(i + 1),
	    		ans + q.charAt(i));
	        }
	 }
}
public static void main(String[] args) {
	z = new ArrayList<>();
	permutation("12345","");
	for(int i = 0; i < z.size(); i++)
		System.out.println(z.get(i));
}

Recherche de bisection

En java, une dichotomie est possible avec Arrays.binarySearch. Arrays.binarySearch renvoie la position si le tableau contient une clé, sinon il retourne la position où la clé doit être insérée. Puisqu'il n'y a pas de méthodes telles que C ++ limite inférieure et limite supérieure, le nombre ne peut pas être compté par dichotomie. Alors je l'ai mis en œuvre moi-même.

public static int lowerbound(int[] a, int key) {
	if(a[a.length-1] < key)
		return a.length;
	int lb = 0, ub = a.length-1, mid;
	do {
		mid = (ub+lb)/2;
		if(a[mid] < key)
			lb = mid + 1;
		else
			ub = mid;
	}while(lb < ub);
	return ub;
}
public static int upperbound(int[] a, int key) {
	if(a[a.length-1] <= key)
		return a.length;
	int lb = 0, ub = a.length-1, mid;
	do {
		mid = (ub+lb)/2;
		if(a[mid] <= key)
			lb = mid + 1;
		else
			ub = mid;
	}while(lb < ub);
	return ub;
}
public static int count(int[] a, int key) {
	return upperbound(a, key) - lowerbound(a, key);
}

Affacturage

Une méthode qui factorise et enregistre dans HashMap.

static Map<Integer, Integer> fact = new HashMap<>();
public static void factorization(int N){
	for(int i = 2; i <= Math.sqrt(N); i ++) {
		if(N % i == 0) {
			int n = 0;
			while(N % i == 0) {
				N /= i;
				n++;
			}
			fact.put(i, n);
		}
	}
	if(N > 1)
		fact.put(N, 1);
}

Postscript

Cet article est en cours de rédaction. Je vais le mettre à jour de temps en temps.

Recommended Posts

mémo de programmation du concours java
Mémo Java
Aide-mémoire privé pour la programmation compétitive (Java)
java quoi que ce soit mémo
Mémo Java Silver
bases de la programmation Java
Remarque sur Java SE 7
java n'importe quoi mémo 2
Mémo de spécification Java
Mémo de modèle Java
Mémo de l'environnement de développement Java
mémo de connaissances de base java
Mémo d'apprentissage Java (méthode)
Mémo Java Kuche Day
java se 8 programmeur Ⅰ mémo
Mémo privé payant Java
Bases de la programmation Java Practice-array
Mémo d'apprentissage Java (basique)
(Mémo) Java pour instruction
expression lambda java [écriture de notes]
Mémo d'apprentissage Java (interface)
Programmation Java (structure de classe)
Tout sur la programmation Java
Mémo d'apprentissage Java (héritage)
[Mémo] Liste liée Java
Thread de programmation Java exécutable
Remarque sur Java (WebSphere Application Server) [1]
[Java] Mémo de nom du nom de variable
Sous-chaîne de mémo Java (classe standard)
Mémo d'apprentissage Java (type de données)
Programmation Java incroyable (arrêtons-nous)
Longueur du mémo Java (classe standard)
Programmation Java (variables et données)
Mémo de la méthode d'étude Java Silver
Créer une méthode java [Memo] [java11]
Mémo de préparation à l'examen Java Silver
Bases du développement Java-Pratique ③ Programmation avancée-
Instruction pratique de base de la programmation Java
Mémo d'apprentissage Java (opérateur logique)
Mémo d'apprentissage Java (classe abstraite)
[Java] Date Termes associés mémo
Mémo d'étude Java 2 avec Progate
Instruction de base de la programmation Java Practice-Switch
Que sont les métriques Java? _Memo_20200818
Java HashMap, entrySet [Mémo personnel]
[Java] Termes de base en programmation
Un mémo pour démarrer la programmation Java avec VS Code (version 2020-04)
[Eclipse Java] Mémo des paramètres de l'environnement de développement
Mémo d'apprentissage Java (création d'un tableau)
Mémo d'utilisation de JCA (Java Encryption Architecture)
[Java] Mémo pour nommer les noms de classe
Cahier d'exercices de programmation de fonctions Java --zipWith-
[Mémo de la session d'étude] Java Day Tokyo 2017
Mémo d'apprentissage Java (instruction while, instruction do-while)
Java
De Java à VB.NET - Écriture de notes de contraste
Trébuchement de java débutant [rédaction de mémos]
Java