Kactl
Kactl
Monaschinas
Dobby, Sebastian, Jack
2023-10-07
1 Contest 1 troubleshoot.txt 16 lines
if(left >= w[pos]) {
ans = max(ans, v[pos] + solve(pos+1, left-w[pos]));
Wrong answer: }
2 Dynamic Prog 1 - Formato de salida (falta un ’n’ o ’ ’).
- Debuggear el codigo con couts (sin fast input). vis[pos][left] = 1;
- Checkear si limpia memoria por cada test case. return dp[pos][left] = ans;
3 Data structures 3 }
Runtime error:
- Lectura fuera del vector.
4 Number theory 4 - Division entre 0.
int main(){
solve(0, C);
}
5 Graph 4 Time limit exceeded:
- Recursion infinita.
- Escribir la complejidad temporal.
6 Strings 9 KnapsackIter.h
Tips: Description: Knapsack iterativo.
- Trabajar en equipo (discutir ideas, revisar codigo, etc). Time: O (N ∗ C) c72d6b, 24 lines
7 Game theory 10 - Tomar un descanzo (ej. ir a los servicios higienicos). int n, C;
int v[N];
8 Various 10 int w[N];
Dynamic Prog (2)
// Memoria O(N)
.vimrc 6 lines
const int N = 1e2 + 5; // Limite de ”n”
int n;
const int W = 1e4 + 5; // Limite de capacidad
set cin aw ai is ts=4 sw=4 tm=50 nu noeb bg=dark ru cul int a[N];
int n, C;
sy on | im jk <esc> | im kj <esc> | no ; : int memo[N];
int v[N];
" Select region and then type :Hash to hash your selection. int w[N];
" Useful for verifying that there aren’t mistypes. int solve(){
ca Hash w !cpp -dD -P -fpreprocessed \| tr -d ’[:space:]’ \ for(int i = 0; i < n; i++){
// Memoria O(N∗C)
\| md5sum \| cut -c-6 if(i == 0) {
int dp[N][W];
memo[i] = a[i];
bool vis[N][W];
} else {
hash.sh memo[i] = max(a[i], a[i] + memo[i-1]);
3 lines int solve(int pos, int left){
}
if(pos == n) return 0;
# Hashes a file, ignoring all whitespace and comments. Use for }
if(vis[pos][left]) return dp[pos][left];
# verifying that code was correctly typed. return *max_element(memo, memo+n);
cpp -dD -P -fpreprocessed | tr -d ’[:space:]’| md5sum |cut -c-6 }
int ans = solve(pos+1, left);
plate .bashrc .vimrc hash troubleshoot SumaRango KnapsackRec KnapsackIter maxsubarray1D maxsubarray1Dprefix maxsubarray2D maxsubarray2Dprefix SumaStaticQuery LCS LCSfind
KTH 2
maxsubarray1Dprefix.h } }
Description: Diferencia de prfijos return memo[n][m];
Time: O (N ) db4a4e, 31 lines maxsubarray2Dprefix.h }
// S[ i ] = a [ 1 ] + . . . + a [ i ] Description: F[i][j]: Suma hasta fila i de la columna j-
// suma( l , r ) = S[ r ] − S[ l −1] Time: O N 3 4e693e, 28 lines LCSfind.h
ll F[N][N]; Description: Find the path.
// F[ i ] : Maxima suma de arreglo que termina en pos ’ i ’ Time: O N 2 4c3fb7, 33 lines
// F[ i ] : max(S[ r ] − S[ l −1]) donde 0 <= l < r void solve(){
// F[ i ] : S[ r ] + max(−S[ l −1]) donde S[ r ] se itera y max(−S[ l −1]) const int N = 100, M = 100, inf = 1e9;
// preprocesar int memo[N][N];
se procesa en marcha for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){ string solve(){
// S[ r ] : prefix F[i][j] = a[i][j];
// S[ l −1]: bestprefix for(int i = 1; i <= n; i++){
if(i) F[i][j] += F[i-1][j]; for(int j = 1; j <= m; j++){
const int N = 1e5 + 5; }
const int inf = 1e9; int cur = 0;
} // Cuidado con memo [−1]
// suma en 2D if(s[i-1] == t[j-1]) cur = max(cur, 1 + memo[i-1][j
int n; int ans = INT_MIN;
int a[N]; -1]);
for(int r1 = 0; r1 < n; r1++){ else cur = max(memo[i-1][j], memo[i][j-1]);
int memo[N]; for(int r2 = r1; r2 < n; r2++){
int prefix = 0, mini = 0; memo[i][j] = cur;
int solve(){ for(int i = 0; i < n; i++){
ll prefix = 0; }
int col = F[r2][i]; }
ll mini = 0; if(r1){
ll ans = -inf; col -= F[r1-1][i];
for(int i = 0; i < n; i++){ string ans = "";
} int i = n, j = m;
prefix += a[i]; prefix += col;
if(ans < prefix - mini){ while(i > 0 and j > 0){
if(ans < prefix - mini) ans = prefix - mini; if(s[i-1] == t[j-1]){
ans = prefix - mini; if(mini > prefix) mini = prefix;
} ans.push_back(s[i-1]);
} i -= 1;
if(mini > prefix){ // be s t p r e f ix para i+1 }
mini = prefix; j -= 1;
} } else {
} cout << ans;
} if(memo[i-1][j] > memo[i][j-1]){
} i -= 1;
return ans;
} } else {
SumaStaticQuery.h j -= 1;
Description: Query en un array estático. }
maxsubarray2D.h Time: O (N ) }
Description: S[i][j]: Suma hasta fila i, columna j. 6186d8, 14 lines
}
Time: O (N ) 769e50, 30 lines
int main(){ reverse(ans.begin(), ans.end());
for(int i = 0; i < n; i++){ return ans;
ll S[N][N]; cin >> a[i]; }
a[i] += (i-1 >= 0 ? a[i-1] : 0);
void solve(){ }
// preprocesar while(q--){ LCSfollow.h
for(int i = 0; i < n; i++){ int l, r; Description: Follow the path.
for(int j = 0; j < n; j++){ cin >> l >> r; Time: O N 2
int suma = a[i][j]; ffa3d3, 41 lines
r--;
if(i) suma += S[i-1][j]; ll suma = a[r] - (l-1 >= 0 ? a[l-1] : 0); const int N = 100, M = 100, inf = 1e9;
if(j) suma += S[i][j-1]; cout << suma << "\n";
if(i and j) suma -= S[i-1][j-1]; } int memo[N][N];
S[i][j] = suma; return 0; int choice[N][N];
} }
} string solve(){
// suma en 2D for(int i = 1; i <= n; i++){
int ans = INT_MIN; 2.2 Subsequence for(int j = 1; j <= m; j++){
for(int r1 = 0; r1 < n; r1++){ LCS.h // Cuidado con memo [−1]
for(int r2 = r1; r2 < n; r2++){ Description: Longest Common Subsequence if(s[i-1] == t[j-1]) {
for(int c1 = 0; c1 < n; c1++){ Time: O (N ∗ C) memo[i][j] = 1 + memo[i-1][j-1];
for(int c2 = c1; c2 < n; c2++){ 300365, 12 lines choice[i][j] = 0;
int suma = S[r2][c2]; int solve(){ }
if(r1) suma -= S[r1-1][c2]; for(int i = 1; i <= n; i++){ else {
if(c1) suma -= S[r2][c1-1]; for(int j = 1; j <= m; j++){ if(memo[i-1][j] > memo[i][j-1]){
if(r1 and c1) suma += S[r1-1][c1-1]; int ans = 0; memo[i][j] = memo[i-1][j];
ans = max(ans, suma); // Cuidado con memo [−1] choice[i][j] = 1;
} if(s[i-1] == t[j-1]) ans = max(ans, 1 + memo[i-1][j } else {
} -1]); memo[i][j] = memo[i][j-1];
} else ans = max(memo[i-1][j], memo[i][j-1]); choice[i][j] = 2;
} memo[i][j] = ans; }
cout << ans; } }
KTH LIS SegmentTree FenwickTree MinQueue SQRT 3
} SegmentTree.h
} Description: Estructura de consulta y actualizacion en rangos. ST index- struct MinStack {
ado en 0, pero ’pos’ inicia en 1. stack<pair<int, int>> S;
string ans = ""; Time: O (log N ) void push(int x){
4fd1d0, 35 lines
int i = n, j = m; S.push(make_pair(x, min(x, S.empty() ? INT_MAX : S.top
while(i > 0 and j > 0){ const int N = 1e5 + 5; ().second)));
if(choice[i][j] == 0){ const int MAX = 4*N; }
ans.push_back(s[i-1]); ll st[MAX]; void pop(){
i -= 1; if(!S.empty()){
j -= 1; void build(int pos=1, int l=0, int r=n-1){ S.pop();
} else if(choice[i][j] == 1){ if(l == r){ }
i -= 1; st[pos] = a[l]; }
} else { } bool empty(){
j -= 1; int mi = (l+r)/2; return S.empty();
} build(2*pos, l, mi); }
} build(2*pos+1, mi+1, r); int top(){
reverse(ans.begin(), ans.end()); st[pos] = st[2*pos] + st[2*pos+1]; return S.empty() ? -1 : S.top().first;
return ans; } }
} int get_min(){
// x , y (query) return S.empty() ? -1 : S.top().second;
// l , r (subarray) }
LIS.h ll query(int x, int y, int pos, int l, int r){ };
Description: Longest Increasing Subsequence if(y < l or x > r) return 0;
Time: O (N ∗ logN ) if(l >= x and r <= y) return st[pos]; struct MinQueue{
ca343f, 41 lines int mi = (l+r)/2; MinStack in, out;
const int N = 100; ll left = query(x, y, 2*pos, l, mi); void push(int x){
int n; ll right = query(x, y, 2*pos+1, mi+1, r); in.push(x);
int a[N]; return left + right; }
vector<int> vec; } void pop(){
if(out.empty()){
void add(int left, int right, int val){ void update(int x, int y, int pos, int l, int r){ while(!in.empty()){
if(left == right){ if(l == r){ out.push(in.top());
if(vec[left] >= val){ st[pos] = y; in.pop();
vec[left] = val; return; }
} else { } }
vec.emplace_back(val); int mi = (l+r)/2; if(!out.empty()){
} if(x <= mi) update(x, y, 2*pos, l, mi); out.pop();
return; else update(x, y, 2*pos+1, mi+1, r); }
} st[pos] = st[2*pos] + st[2*pos+1]; }
int mid = (right - left)/2; } bool empty(){
return in.empty() and out.empty();
if(val <= vec[mid]){ }
add(left, mid, val);
FenwickTree.h int front(){
Description: Estructura de prefijo que permite modificaciones y consulta
} else { if(out.empty()){
en O(log N).
add(mid+1, right, val); while(!in.empty()){
Time: O (log N ) e2642f, 18 lines
} out.push(in.top());
} const int N = 1000000 + 5; in.pop();
void imprime_vector(){ ll ft[N]; }
for(int i = 0; i < vec.size(); i++){ }
cout << vec[i] << " "; void update(int pos, int val){ return out.empty() ? -1 : out.top();
} while(pos <= MAXI){ }
cout << "\n"; ft[pos] += val; int get_min(){
} pos += (pos & -pos); return min(in.empty() ? INT_MAX : in.get_min(),
int main(){ } out.empty() ? INT_MAX : out.get_min());
scanf("%d", &n); } }
for(int i = 0; i < n; i++) cin >> a[i]; } minqueue;
vec.push_back(a[0]); // i n i c i a l ll query(int pos){
ll res = 0;
for(int i = 1; i < n; i++){ while(pos > 0){ SQRT.h
add(0, vec.size()-1, a[i]); res += ft[pos]; Description:
√ Estructura
de consulta y actualizacion en raices.
imprime_vector(); pos -= (pos & -pos); Time: O N
912018, 38 lines
} }
return res; // N,Q <= 1e5
cout << vec.size() << "\n"; } const int N = 1e5 + 5;
return 0; const int SQRT = 450;
}
MinQueue.h int n, q;
Description: Estructura de consulta en O(1) amortizado y actualización int a[N];
O(1). int bsize;
Data structures (3) Time: O (log N ) 5a7abe, 54 lines ll sum[SQRT];
KTH Primo FactoresPrimos Tdprimes Criba Euclides EuclidesExtended UniversalSink NumberPaths 4
} int col = 0;
Primo.h for(int i = 0; i < n; i++){
Description: Verifica si un numero es primo. cout << "? " << j+1 << " " << i+1 << "\n";
Time: O (logN ) Euclides.h fflush(stdout);
2f50f9, 8 lines Description: Euclides para hallar mcd (gcd).
bool primo(int n){ Time: O (logN ) 21d9fc, 4 lines bool e;
for(int i = 2; i*i <= n; i++){
int gcd(int a, int b){ cin >> e;
if(n % i == 0){
if(a == 0) return b; col += e;
return 0;
return gcd(b % a, a); }
}
} if(row == n-1 && col == 0){
}
cout << "! " << j+1 << "\n";
return !;
fflush(stdout);
} EuclidesExtended.h } else {
Description: Euclides extendido ax + by = gcd(a, b) cout << "! " << -1 << "\n";
FactoresPrimos.h Time: O (logN ) 343534, 20 lines fflush(stdout);
Description:
√ Encuentra
los factores primos. int gcdExtended(int a, int b, int *x, int *y){ }
Time: O N // Base case return 0;
7ade7a, 13 lines }
if(a == 0){
void solve(){ *x = 0;
for(int i = 2; 1ll*i*i <= n; i++){ *y = 1;
if(n % i == 0){ return b; NumberPaths.h
while(n % i == 0){ } Description: Encuentra el número de caminos con longitud l, para ello usa
cout << i << " "; int x1, y1; binary exponentation.
n /= i; int gcd = gcdExtended(b % a, a, &x1, &y1); Time: O (N ∗ N ∗ logN ) 1f59af, 54 lines
}
} const int MOD = 1e9 + 7;
*x = y1 - (b/a)*x1;
} *y = x1;
if(n > 1){ typedef vector<int> vi;
return gcd;
cout << n << "\n"; typedef vector<vector<int>> vvi;
}
}
} vvi multiply(vvi a, vvi b, int n){
int main(){
vvi c (n, vi(n));
int x, y;
// multiply
Tdprimes.h int gcd = gcdExtended(a, b, &x, &y);
for(int i = 0; i < n; i++){
Description: Encuentra los factores primos. cout << x << y << gcd;
for(int j = 0; j < n; j++){
Time: O (logN ) }
0bdcc4, 17 lines for(int k = 0; k < n; k++){
KTH BFS BFSfrontier Dijkstra BellmanFord 5
c[i][j] = (c[i][j] + 1ll * a[i][k] * b[k][j]) % dis[v] = dis[u] + 1; // O(ElogE)
MOD; vis[v] = 1; vector<ll> d(n, inf);
} Q.push(v); d[s] = 0;
} }
} } priority_queue<pair<ll, int>, vector<pair<ll, int>>,
return c; } greater<pair<ll, int>>> Q;
} Q.emplace(make_pair(0, s));
int main(){
vvi exp_power(vvi a, int n, int l){ cin >> n; while(!Q.empty()){
vvi result (n, vi(n)); for(int i = 0; i < n; i++){ int u;
// identity matrix int u, k; ll dis;
for(int i = 0; i < n; i++) result[i][i] = 1; cin >> u >> k; tie(dis, u) = Q.top();
u--; Q.pop();
while(l > 0){ for(int j = 0; j < k; j++){ if(dis != d[u]) continue;
if(l & 1){ int v;
result = multiply(result, a, n); cin >> v; //for (auto [ v , w] : G[u] ){ // Feature in C++ 17
} v--; for(auto pair : G[u]){
l /= 2; G[u].push_back(v); int v;
a = multiply(a, a, n); } ll w;
} } tie(v, w) = pair;
return result; bfs(0);
} for(int i = 0; i < n; i++){ if(d[v] > d[u]+ w){
cout << i+1 << " " << (dis[i] == inf ? -1 : dis[i]) << d[v] = d[u] + w;
int main(){ "\n"; Q.emplace(make_pair(d[v], v));
int n, l; } }
cin >> n >> l; return 0; }
vvi a(n, vi(n)); } }
for(int i = 0; i < n; i++){
for(int i = 0; i < n; i++){ printf("%lld%c", d[i], " \n"[i+1 == n]);
for(int j = 0; j < n; j++){ BFSfrontier.h }
cin >> a[i][j]; Description: Encuentra el camino màs corto de un nodo hacia los demas. }
} Todas las aristas tienen el mismo peso.
} Time: O (|V | + |E|) 120650, 26 lines int main(){
vvi al = exp_power(a, n, l); const int inf = 1e9 + 10; // Inout
// cout << ” r e s u l t matrix \n”; const int N = 1e5 + 5; G[u].emplace_back(make_pair(v, w));
// for ( int i = 0; i < n; i++){ G[v].emplace_back(make_pair(u, w));
// for ( int j = 0; j < n; j++){ vector<int> G[N]; // Process
// cout << al [ i ] [ j ] << ” ”; bool vis[N]; Dijsktra(0);
// } int dis[N]; }
// cout << ”\n”;
// } void bfs(int s){
cout << al[0][n-1]; for(int i = 0; i < n; i++) dis[s] = inf; BellmanFord.h
return 0; vector<int> front = {s}; Description: Calcula el camino más corto de s en un grafo, este puede tener
} dis[s] = 0; aristas negativas, pero no puede tener ciclos negativos.
vis[s] = 1; Time: O (V ∗ E) 340af8, 32 lines
int m;
cin >> m;
while(m--){
int l;
cin >> l;
int ans;
for(int i = 0; i < l; i++){
int heap;
cin >> heap;
if(i == 0){
ans = grundy(heap, S);
KTH techniques 11