Aconteceu no dia 14 de Novembro de forma remota a etapa da regional da Maratona de Programação. O resultado completo pode ser conferido aqui. Em 2020 a sede Goiânia teve 24 times de 6 instituições de todo o estado, ambos realizaram a prova de forma remota. As 10 melhores equipes podem ser vistas na imagem abaixo.
As equipes “Monkeys” do INF-UFG e BalloonField da PUC-Goiás se classificaram para a fase nacional da maratona que acontecerá nos dias 11 a 13 de março de 2021 online. Boa sorte!
A prova esse ano veio de uma forma diferente já que seria realizada de forma remota, questões que não exirgiam muito código e mais raciocínio e com um nível interessante. As dicas de soluções dos juizes podem ser encontradas aqui. Além disso, algumas explicações mais elaboradas e exemplos de implementação podem ser encontradas abaixo.
Problema | Dificuldade | Técnica relacionada |
---|---|---|
A - Álbum de Figurinhas | médio | programação dinâmica + matemática |
B - Batalha Naval | balão++ | implementação |
C - Concatenando Times | difícil | strings |
D - Dança da Divisibilidade | difícil | algebra, exponeciação de matriz, recorrência linear |
E - Empresa de Festas | médio | grafos, dfs, lca |
F - Fastminton | fácil | adhoc |
G - Game Show! | fácil | programação dinâmica |
H - Hangar do SBC | fácil/médio | adhoc, miscellaneous |
I - Interatividade | médio | programação dinâmica, dfs |
J - Juntando Dados | difícil | geometria, algebra |
K - Ká entre Nós | médio/difícil | algebra, gauss |
L - Lavaspar | fácil | adhoc |
M - Metralhadora | fácil | persistent segment tree, sweep line, binary search |
N - Números Multiplicados | fácil/médio | crivo, matemática |
O - Ônibus Venusiano | difícil | geometria, line sweep |
A - Álbum de Figurinhas
#include <bits/stdc++.h> | |
using namespace std; | |
const int N = int(1e6) + 10; | |
double dp[N]; | |
int main(){ | |
int n, a, b; | |
scanf("%d %d %d", &n, &a, &b); | |
// printf("%.6lf\n", solve(n, a, b)); | |
// return 0; | |
if(a != 0){ | |
for(int i = 1 ; i < a ; i++){ | |
dp[i] = 1.0; | |
} | |
double pref = 0.0; | |
for(int i = a ; i <= n ; i++){ | |
int t = b - a + 1; | |
pref += dp[i - a]; | |
if(i - b - 1 >= 0){ | |
pref -= dp[i - b - 1]; | |
} | |
double val =1.0 + (pref / double(t)); | |
dp[i] = val; | |
} | |
}else{ | |
double pref = 0.0; | |
for(int i = 1 ; i <= n ; i++){ | |
int t = b - a + 1; | |
if(i){ | |
pref += dp[i - 1]; | |
} | |
if(i - b - 1 >= 0){ | |
pref -= dp[i - b - 1]; | |
} | |
dp[i] = ((double(t) + pref) / t) / (1.0 - double(1.0 / t)); | |
} | |
} | |
printf("%.7lf\n", dp[n]); | |
return 0; | |
} |
B - Batalha Naval
#include <bits/stdc++.h> | |
using namespace std; | |
int cnt[100][100]; | |
int main(){ | |
int n; | |
scanf("%d", &n); | |
bool ok = true; | |
for(int i = 0 ; i < n ; i++){ | |
int d, l, r, c; | |
scanf("%d %d %d %d", &d, &l, &r, &c); | |
if(d){ | |
while(l){ | |
if(r > 10 || c > 10){ | |
ok = false; | |
break; | |
} | |
if(cnt[r][c] > 0){ | |
ok = false; | |
break; | |
} | |
cnt[r][c]++; | |
r++; | |
l--; | |
} | |
}else{ | |
while(l){ | |
if(r > 10 || c > 10){ | |
ok = false; | |
break; | |
} | |
if(cnt[r][c] > 0){ | |
ok = false; | |
break; | |
} | |
cnt[r][c]++; | |
c++; | |
l--; | |
} | |
} | |
if(!ok){ | |
break; | |
} | |
} | |
if(ok){ | |
printf("Y\n"); | |
}else{ | |
printf("N\n"); | |
} | |
return 0; | |
} |
C - Concatenando Times
Em breve
D - Dança da Divisibilidade
Em breve
E - Empresa de Festas
Em breve
F - Fastminton
Em breve
G - Game Show!
Em breve
H - Hangar do SBC
Em breve
I - Interatividade
Em breve
J - Juntando Dados
Em breve
K - Ká entre Nós
Em breve
L - Lavaspar
Em breve
M - Metralhadora
Em breve
N - Números Multiplicados
#include <bits/stdc++.h> | |
using namespace std; | |
typedef unsigned long long ll; | |
typedef pair< int, int > pii; | |
const int N = 31622776 + 10; | |
const int M = int(2e3) +100; | |
int lp[N+1]; | |
vector< ll > primes; | |
vector< pii > adj[N]; | |
ll sum[M]; | |
ll a[M]; | |
ll ans[M]; | |
void sieve(){ | |
for (int i=2; i< N; ++i) { | |
if (lp[i] == 0) { | |
lp[i] = i; | |
primes.push_back (i); | |
} | |
for (int j=0; j<(int)primes.size() && primes[j]<=lp[i] && i*primes[j]<=N; ++j) | |
lp[i * primes[j]] = primes[j]; | |
} | |
} | |
int main(){ | |
sieve(); | |
// printf("%lu\n", primes.size()); | |
int m, n, k; | |
scanf("%d %d %d", &m, &n, &k); | |
for(int i = 1 ; i <= n ; i++){ | |
scanf("%lld", &a[i]); | |
} | |
for(int i = 0 ; i < k ; i++){ | |
int l, r, d; | |
scanf("%d %d %d", &l, &r, &d); | |
if(sum[l] == 0) | |
sum[l] += a[r]; | |
adj[r].push_back({l, d}); | |
} | |
int j = 0; | |
int i = 1; | |
while(j < primes.size()){ | |
while(i <= m && j < primes.size()){ | |
if(sum[i] % primes[j] == 0LL){ | |
ans[i] = primes[j]; | |
break; | |
} | |
j++; | |
} | |
i++; | |
j++; | |
} | |
for(int i = 1 ; i <= n ; i++){ | |
int pt = -1; | |
// printf("%lu\n", adj[i].size()); | |
for(auto u: adj[i]){ | |
// printf("%d %d\n", i, u.first); | |
if(ans[u.first]){ | |
// printf("entrei %d %d\n", i, u.first); | |
while(u.second){ | |
a[i] /= ans[u.first]; | |
u.second--; | |
} | |
}else{ | |
pt = u.first; | |
} | |
} | |
// printf("%lld\n", a[i]); | |
if(pt != -1){ | |
ans[pt] = a[i]; | |
} | |
} | |
for(int i = 1 ; i <= m ; i++){ | |
assert(ans[i] != 0); | |
printf("%lld ", ans[i]); | |
} | |
printf("\n"); | |
return 0; | |
} |
O - Ônibus Venusiano
Em breve