-
Notifications
You must be signed in to change notification settings - Fork 0
/
5-TabuleiroSecreto.js
118 lines (92 loc) · 3.58 KB
/
5-TabuleiroSecreto.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/*
Tabuleiro Secreto
O senhor Milli, morador da cidade Petland, é o famoso proprietário da maior fábrica de jogos de tabuleiros do mundo.
Recentemente, ele teve a ideia de lançar um novo jogo exclusivo de tabuleiro, que ele apelidou de Tabuleiro da Frequência.
O jogo ocorre da seguinte forma. Inicialmente, um tabuleiro com dimensões N × N é dado contendo apenas 0’s.
Depois disso, Q operações são propostas, podendo ser de 4 tipos:
1 X R: Atribuir o valor R a todos os números da linha X;
2 X R: Atribuir o valor R a todos os números da coluna X;
3 X: Imprimir o valor mais frequente na linha X;
4 X: Imprimir o valor mais frequente da coluna X.
Milli não é muito bom com computadores, mas é bastante preguiçoso.
Sabendo que você é um dos melhores programadores do mundo, ele precisa sua ajuda para resolver este problema.
Entrada
A primeira linha da entrada é composta por dois inteiros N e Q (1 ≤ N, Q ≤ 10⁵), representando, respectivamente, o tamanho do tabuleiro e
a quantidade de operações. As próximas Q linhas da entrada vão conter as Q operações. O primeiro inteiro de cada linha vai indicar o tipo
da operação. Caso seja 1 ou 2, será seguido por mais dois inteiros X (1 ≤ X ≤ N) e R (0 ≤ R ≤ 50). Caso seja 3 ou 4, será seguido por apenas
mais um inteiro X.
Saída
Para cada operação do tipo 3 ou 4, seu programa deve produzir uma linha, contendo o valor da resposta correspondente. Se uma linha ou
coluna tiver dois ou mais valores que se repetem o mesmo número de vezes, você deve imprimir o maior deles. Por exemplo, se uma linha
tem os valores [5,7,7,2,5,2,1,3], tanto o 2, 5 e 7 se repetem duas vezes, então a resposta será 7, pois é o maior deles.
*/
let input;
const limit = Math.pow(10, 5);
let T, X, R;
var output = '';
const operation = {
'1': function fillLine(matrix, line, num) {
for (let index = 0; index < matrix.length; index++) {
matrix[line - 1][index] = num;
}
},
'2': function fillColumn(matrix, col, num) {
for (let index = 0; index < matrix.length; index++) {
matrix[index][col - 1] = num;
}
},
'3': function showMostFrequentAtLine(matrix, line) {
const lineValues = matrix[line - 1];
output += getMostFrequentIn(lineValues) + '\n';
},
'4': function showMostFrequentAtColumn(matrix, col) {
const columnValues = matrix.map(line => line[col - 1]);
output += getMostFrequentIn(columnValues) + '\n';
}
}
const getMostFrequentIn = (values) => {
let n = values.length;
if (n == 0) return null;
let map = {}, most = values[0], freqCount = 1;
for (let i = 0; i < n; i++) {
let el = values[i];
if (map[el] == null)
map[el] = 1;
else
map[el]++;
if (map[el] > freqCount) {
most = el;
freqCount = map[el];
}
else if (map[el] === freqCount) {
most = Math.max(most, el);
}
}
return most;
}
while (true) {
input = gets()
if (!input || input === '') break;
let [N, Q] = input.match(/\d+/g);
N = parseInt(N);
Q = parseInt(Q);
if (N < 1 || N > limit || Q < 1 || N > limit) break;
let matrix = Array.from(Array(parseInt(N)), () => new Array(parseInt(N)).fill(0));
for (let index = 0; index < Q; index++) {
let [T, X, R] = gets().split(/[ ]+/g);
X = parseInt(X);
R = parseInt(R);
if (/[12]/.test(T)) {
if (X < 1 || X > N || R < 0 || R > 50) {
continue;
}
}
if (/[34]/.test(T)) {
if (X > N || X < 0) {
continue;
}
}
operation[T](matrix, X, R);
}
console.log(output);
}