cses

cses solutions in pure c
git clone git://git.superpozycja.net/cses
log | files | refs

commit a5b17a679d641ba860c6e2a20bf662721ea79b74
parent 1d43dde251acb864f031659f5b5cd91aaf67dac2
author: anna <anna@superpozycja.net>
date:   Sat,  6 Jun 2026 03:13:15 +0200

cses: add solutions so far

Signed-off-by: anna <anna@superpozycja.net>

diffstat:
A00_intro/00_weird_algorithm/s.c | 23+++++++++++++++++++++++
A00_intro/01_missing_number/s.c | 25+++++++++++++++++++++++++
A00_intro/02_repetitions/s.c | 24++++++++++++++++++++++++
A00_intro/03_increasing_array/s.c | 28++++++++++++++++++++++++++++
A00_intro/04_permutations/s.c | 26++++++++++++++++++++++++++
A00_intro/05_number_spiral/s.c | 25+++++++++++++++++++++++++
A00_intro/06_two_knights/s.c | 23+++++++++++++++++++++++
A00_intro/07_two_sets/s.c | 57+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A00_intro/08_bit_strings/s.c | 48++++++++++++++++++++++++++++++++++++++++++++++++
A00_intro/09_trailing_zeros/s.c | 31+++++++++++++++++++++++++++++++
A00_intro/10_coin_piles/.swp | 0
A00_intro/10_coin_piles/s.c | 33+++++++++++++++++++++++++++++++++
A00_intro/11_palindrome_reorder/.test.swp | 0
A00_intro/11_palindrome_reorder/s.c | 66++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A00_intro/12_gray_code/s.c | 34++++++++++++++++++++++++++++++++++
A00_intro/13_tower_of_hanoi/s.c | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
A00_intro/14_creating_strings/s.c | 72++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A00_intro/15_apple_division/.s.c.swp | 0
A00_intro/15_apple_division/s.c | 53+++++++++++++++++++++++++++++++++++++++++++++++++++++
A00_intro/16_chessboard_and_queens/s.c | 72++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A00_intro/17_raab_game_I/s.c | 54++++++++++++++++++++++++++++++++++++++++++++++++++++++
A00_intro/18_mex_grid_construction/.swo | 0
A00_intro/18_mex_grid_construction/.swp | 0
A00_intro/18_mex_grid_construction/s.c | 40++++++++++++++++++++++++++++++++++++++++
A00_intro/19_knight_moves_grid/s.c | 124+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A00_intro/20_grid_coloring/s.c | 46++++++++++++++++++++++++++++++++++++++++++++++
A00_intro/21_digit_queries/.swp | 0
A00_intro/21_digit_queries/s.c | 53+++++++++++++++++++++++++++++++++++++++++++++++++++++
A00_intro/22_string_reorder/s.c | 29+++++++++++++++++++++++++++++
A00_intro/23_grid_path_description/s.c | 74++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A00_intro/s.c | 17+++++++++++++++++
A01_sorting_and_searching/00_distinct_numbers/s.c | 99+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A01_sorting_and_searching/s.c | 17+++++++++++++++++
33 files changed, 1244 insertions(+), 0 deletions(-)

diff --git a/00_intro/00_weird_algorithm/s.c b/00_intro/00_weird_algorithm/s.c @@ -0,0 +1,23 @@ +#include <stdio.h> + +void solve() +{ + long long unsigned int n; + + scanf("%llu", &n); + printf("%llu ", n); + + while (n > 1) + printf("%llu ", n = (n % 2) ? 3 * n + 1 : n / 2); + + printf("\n"); + return; +} + +int main() +{ + int t = 1; + + while (t--) + solve(); +} diff --git a/00_intro/01_missing_number/s.c b/00_intro/01_missing_number/s.c @@ -0,0 +1,25 @@ +#include <stdio.h> + +void solve() +{ + unsigned long long s = 0; + unsigned long long n; + + scanf("%llu", &n); + + for(int i = 0; i < n - 1; i++) { + unsigned long long tmp; + + scanf("%llu", &tmp); + s += tmp; + } + printf("%llu\n", (n*(n+1))/2 - s); + return; +} + +int main() +{ + int t = 1; + while (t--) + solve(); +} diff --git a/00_intro/02_repetitions/s.c b/00_intro/02_repetitions/s.c @@ -0,0 +1,24 @@ +#include <stdio.h> +#include <stdlib.h> + +void solve() +{ + int c; + int prev = '0'; + unsigned long long res = 1; + unsigned long long running = 1; + while ((c = getchar()) != EOF) { + running = c == prev ? running + 1 : 1; + res = running > res ? running : res; + prev = c; + } + printf("%llu\n", res); + return; +} + +int main() +{ + int t = 1; + while (t--) + solve(); +} diff --git a/00_intro/03_increasing_array/s.c b/00_intro/03_increasing_array/s.c @@ -0,0 +1,28 @@ +#include <stdio.h> +#include <stdlib.h> + +void solve() +{ + unsigned int n; + unsigned int cur; + unsigned int prev = 0; + unsigned long long res = 0; + scanf("%u", &n); + + for (int i = 0; i < n; i++) { + scanf("%u", &cur); + res += (cur < prev) * (prev - cur); + prev = cur < prev ? prev : cur; + } + + printf("%llu\n", res); + + return; +} + +int main() +{ + int t = 1; + while (t--) + solve(); +} diff --git a/00_intro/04_permutations/s.c b/00_intro/04_permutations/s.c @@ -0,0 +1,26 @@ +#include <stdio.h> +#include <stdlib.h> + +int solve() +{ + unsigned int n; + + scanf("%u", &n); + + if (n == 1) return printf("1\n"); + if (n <= 3) return printf("NO SOLUTION\n"); + + for (unsigned i = 2; i <= n; i+=2) printf("%u ", i); + for (unsigned i = 1; i <= n; i+=2) printf("%u ", i); + + printf("\n"); + + return 0; +} + +int main() +{ + int t = 1; + while (t--) + solve(); +} diff --git a/00_intro/05_number_spiral/s.c b/00_intro/05_number_spiral/s.c @@ -0,0 +1,25 @@ +#include <stdio.h> +#include <stdlib.h> + +int solve() +{ + unsigned long long x, y; + + scanf("%llu %llu", &y, &x); + + unsigned long long mx = x > y ? x : y; + unsigned long long mn = x < y ? x : y; + int sel = (mx % 2) ^ (y >= x); + + printf("%llu\n", (mx - (sel)) * (mx - (sel)) + (2 * sel - 1) * (mn - 1 + (sel))); + + return 0; +} + +int main() +{ + int t; + scanf("%d", &t); + while (t--) + solve(); +} diff --git a/00_intro/06_two_knights/s.c b/00_intro/06_two_knights/s.c @@ -0,0 +1,23 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdint.h> + +int solve() +{ + int k; + scanf("%d", &k); + + printf("0\n"); + for (long long i = 2; i <= k; i++) + printf("%lld\n", (i*i*(i*i-1))/2 - 4 * (i - 2) * (i - 1)); + + return 0; +} + +int main() +{ + int t = 1; + while (t--) + solve(); +} diff --git a/00_intro/07_two_sets/s.c b/00_intro/07_two_sets/s.c @@ -0,0 +1,57 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdint.h> + +int solve() +{ + long long lsum = 0, rsum = 0; + int *lset, *rset; + int li = 0, ri = 0; + int n; + + scanf("%d", &n); + + lset = malloc (sizeof(int) * n); + rset = malloc (sizeof(int) * n); + + if (n % 4 == 1 || n % 4 == 2) { + printf("NO\n"); + return 0; + } + + printf("YES\n"); + + for (int i = n; i > 0; i--) { + if (lsum <= rsum) { + lset[li++] = i; + lsum += i; + } + + else { + rset[ri++] = i; + rsum += i; + } + } + + printf("%d\n", li); + for (int i = 0; i < li; i++) + printf("%d ", lset[i]); + + printf("\n"); + + printf("%d\n", ri); + for (int i = 0; i < ri; i++) + printf("%d ", rset[i]); + + printf("\n"); + + return 0; +} + +int main() +{ + int t = 1; + while (t--) + solve(); +} diff --git a/00_intro/08_bit_strings/s.c b/00_intro/08_bit_strings/s.c @@ -0,0 +1,48 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdint.h> + +#define MOD 1000000007 + +int solve() +{ + uint32_t n; + uint64_t res = 1; + scanf("%u", &n); + + n = ((n >> 1) & 0x55555555) | ((n & 0x55555555) << 1); + n = ((n >> 2) & 0x33333333) | ((n & 0x33333333) << 2); + n = ((n >> 4) & 0x0F0F0F0F) | ((n & 0x0F0F0F0F) << 4); + n = ((n >> 8) & 0x00FF00FF) | ((n & 0x00FF00FF) << 8); + n = ( n >> 16 ) | ( n << 16); + + int r; + float f = (float) ( n & -n ); + r = (*(uint32_t *)&f >> 23) - 0x7f; + n >>= r; + + for (int i = 0; i < 32 - r; i++) { + if (n & 1) { + res *= res; + res %= MOD; + res <<= 1; + res %= MOD; + } + else { + res *= res; + res %= MOD; + } + n >>= 1; + } + printf("%llu\n", res); + + return 0; +} + +int main() +{ + int t = 1; + while (t--) + solve(); +} diff --git a/00_intro/09_trailing_zeros/s.c b/00_intro/09_trailing_zeros/s.c @@ -0,0 +1,31 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdint.h> + +int solve() +{ + int res = 0; + int nn = 5; + int n; + + scanf("%d", &n); + + while (nn <= n) { + res += n / nn; + + nn *= 5; + } + + printf("%d\n", res); + + + return 0; +} + +int main() +{ + int t = 1; + while (t--) + solve(); +} diff --git a/00_intro/10_coin_piles/.swp b/00_intro/10_coin_piles/.swp Binary files differ. diff --git a/00_intro/10_coin_piles/s.c b/00_intro/10_coin_piles/s.c @@ -0,0 +1,33 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdint.h> + +int solve() +{ + int n; + + scanf("%d", &n); + + for (int i = 0; i < n; i++) { + uint64_t a, b; + + scanf("%llu %llu", &a, &b); + + if (a == b && a == 0) { + printf("YES\n"); + continue; + } + + printf("%s\n", ((a + b) % 3 == 0 && b / 2 <= a && a <= 2 * b) ? "YES" : "NO"); + } + + return 0; +} + +int main() +{ + int t = 1; + while (t--) + solve(); +} diff --git a/00_intro/11_palindrome_reorder/.test.swp b/00_intro/11_palindrome_reorder/.test.swp Binary files differ. diff --git a/00_intro/11_palindrome_reorder/s.c b/00_intro/11_palindrome_reorder/s.c @@ -0,0 +1,66 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdint.h> + +int solve() +{ + uint32_t abc[26] = { 0 }; + uint8_t odd_ix; + uint8_t odds; + uint32_t n; + int i, j; + char c; + + n = 0; + odds = 0; + odd_ix = 0xff; + + while ((c = getchar()) != EOF) { + abc[c - 0x41]++; + n++; + } + n--; + + for (i = 0; i < 26; i++) { + odds += abc[i] % 2; + if (abc[i] % 2) + odd_ix = i; + } + + if (odds != n % 2) { + printf("NO SOLUTION\n"); + return -1; + } + + for (i = 0; i < 26; i++) { + if (i == odd_ix) + continue; + + for (j = 0; j < abc[i]/2; j++) + putchar(i + 0x41); + } + + if (odds) + for (i = 0; i < abc[odd_ix]; i++) + putchar(odd_ix + 0x41); + + for (i = 25; i >= 0; i--) { + if (i == odd_ix) + continue; + + for (j = 0; j < abc[i]/2; j++) + putchar(i + 0x41); + } + + putchar('\n'); + + return 0; +} + +int main() +{ + int t = 1; + while (t--) + solve(); +} diff --git a/00_intro/12_gray_code/s.c b/00_intro/12_gray_code/s.c @@ -0,0 +1,34 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdint.h> + +int putb(unsigned long long n, unsigned long long sz) +{ + char b[sz + 1]; + char *p = b + sizeof(b); + *--p = 0x00; + do { + *--p = 0x30 + (n & 1); + n >>= 1; + } while (sz--); + return puts(b); +} + +int solve() +{ + int n; + + scanf("%d", &n); + for (int i = 0; i < 1 << n; i++) + putb((i ^ i >> 1), n); + + return 0; +} + +int main() +{ + int t = 1; + while (t--) + solve(); +} diff --git a/00_intro/13_tower_of_hanoi/s.c b/00_intro/13_tower_of_hanoi/s.c @@ -0,0 +1,51 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdint.h> + +int solve() +{ + uint16_t labels[3] = {1,3,2}; + uint32_t n; + uint32_t i; + char *buf; + char *p; + + scanf("%d", &n); + + buf = malloc(sizeof(char) * 262146); + p = buf; + + if (n % 2) { + labels[1] ^= labels[2]; + labels[2] ^= labels[1]; + labels[1] ^= labels[2]; + } + + labels[0] += '0'; + labels[1] += '0'; + labels[2] += '0'; + + p += sprintf(p, "%d\n", (1 << n) - 1); + memset_pattern4(p, "x x\n", 262146 - (p - buf)); + + for (i = 1; i < 1 << n; i++) { + *p = labels[((i & i - 1) % 3)]; + p+=2; + *p = labels[(((i | i - 1) + 1) % 3)]; + p+=2; + } + + *p = '\0'; + + puts(buf); + + return 0; +} + +int main() +{ + int t = 1; + while (t--) + solve(); +} diff --git a/00_intro/14_creating_strings/s.c b/00_intro/14_creating_strings/s.c @@ -0,0 +1,72 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdint.h> + +int comp (const void *a, const void *b) +{ + return (*(char *)a - *(char *)b); +} + +uint64_t fact(uint64_t n) { + uint64_t res = 1; + for (int i = 2; i <= n; i++) + res *= i; + return res; +} + +char a[8]; + +int solve() +{ + char abc[26] = {0}; + uint64_t res = 1; + char s[9]; + char tmp; + int n; + + scanf("%s", s); + n = strlen(s); + qsort(s, n, sizeof(char), comp); + + for (int i = 0; i < n; i++) + abc[s[i]-'a']++; + + res *= fact(n); + + for (int i = 0; i < 26; i++) + res /= fact(abc[i]); + + printf("%llu\n", res); + + while (1) { + int j = n - 2; + int l = n - 1; + + printf("%s\n", s); + + while (j >= 0 && s[j] >= s[j + 1]) j--; + if (j < 0) break; + + while (s[j] >= s[l]) l--; + + tmp = s[j]; + s[j] = s[l]; + s[l] = tmp; + + for (int k = j + 1, l = n - 1; k < l; k++, l--) { + tmp = s[k]; + s[k] = s[l]; + s[l] = tmp; + } + } + + return 0; +} + +int main() +{ + int t = 1; + while (t--) + solve(); +} diff --git a/00_intro/15_apple_division/.s.c.swp b/00_intro/15_apple_division/.s.c.swp Binary files differ. diff --git a/00_intro/15_apple_division/s.c b/00_intro/15_apple_division/s.c @@ -0,0 +1,53 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdint.h> + +int comp (const void *a, const void *b) +{ + return (*(uint32_t *)b - *(uint32_t *)a); +} + +int solve() +{ + uint64_t a = 0, b = 0, res, diff; + uint32_t *p; + int n, i, j, m; + + scanf("%d", &n); + + p = malloc(sizeof(uint32_t) * n); + + for (i = 0; i < n; i++) { + scanf("%d", p + i); + a += p[i]; + } + + res = a; + + for (i = 0; i < 1 << n; i++) { + b = a; + m = i; + j = 0; + + while (m) { + b -= p[j++] * (m & 1); + m >>= 1; + } + + diff = (a - b > b ? a - b - b : b - (a - b)); + res = res < diff ? res : diff; + + } + + printf("%llu\n", res); + + return 0; +} + +int main() +{ + int t = 1; + while (t--) + solve(); +} diff --git a/00_intro/16_chessboard_and_queens/s.c b/00_intro/16_chessboard_and_queens/s.c @@ -0,0 +1,72 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdint.h> + +uint8_t state[8][8]; +uint8_t b[8][8]; +uint64_t res; + +void backtrack(int n) +{ + int i; + int j; + + if (n == 8) { + res++; + return; + } + + for (i = 0; i < 8; i++) { + if (state[n][i] || b[n][i]) + continue; + + for (j = n; j < 8; j++) + state[j][i]++; + + for (j = 0; i + j < 8 && n + j < 8; j++) + state[n+j][i+j]++; + + for (j = 0; i - j >= 0 && n + j < 8; j++) + state[n+j][i-j]++; + + backtrack(n + 1); + + for (j = n; j < 8; j++) + state[j][i]--; + + for (j = 0; i + j < 8 && n + j < 8; j++) + state[n+j][i+j]--; + + for (j = 0; i - j >= 0 && n + j < 8; j++) + state[n+j][i-j]--; + + } +} + +int solve() +{ + int i; + int j; + + for (i = 0; i < 8; i++) { + for (j = 0; j < 8; j++) + if (getchar() == '*') + b[i][j] = 1; + + getchar(); + } + + backtrack(0); + + printf("%llu\n", res); + + return 0; +} + +int main() +{ + int t = 1; + while (t--) + solve(); +} diff --git a/00_intro/17_raab_game_I/s.c b/00_intro/17_raab_game_I/s.c @@ -0,0 +1,54 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdint.h> + +int solve() +{ + int a, b; + int n; + int i; + + scanf("%d %d %d", &n, &a, &b); + + if (a + b > n) { + printf("NO\n"); + return 0; + } + + if (a + b > 0 && (a == 0 || b == 0)) { + printf("NO\n"); + return 0; + } + + printf("YES\n"); + + for (i = 0; i < n - (a + b); i++) + printf("%d ", n - i); + + for (i = b + 1; i < a + b + 1; i++) + printf("%d ", i); + + for (i = 1 ; i < b + 1; i++) + printf("%d ", i); + + printf("\n"); + + for (i = 0; i < n - (a + b); i++) + printf("%d ", n - i); + + for (i = 1; i < a + b + 1; i++) + printf("%d ", i); + + printf("\n"); + + return 0; +} + +int main() +{ + int t; + scanf("%d", &t); + while (t--) + solve(); +} diff --git a/00_intro/18_mex_grid_construction/.swo b/00_intro/18_mex_grid_construction/.swo Binary files differ. diff --git a/00_intro/18_mex_grid_construction/.swp b/00_intro/18_mex_grid_construction/.swp Binary files differ. diff --git a/00_intro/18_mex_grid_construction/s.c b/00_intro/18_mex_grid_construction/s.c @@ -0,0 +1,40 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdint.h> + +int solve() +{ + int *row, *col; + int i, j, x; + int n, m; + + scanf("%d", &n); + + m = 2 * n; + + row = malloc(sizeof(int) * m * n); + col = malloc(sizeof(int) * m * n); + + for (i = 0; i < n; i++) { + for (j = 0; j < n; j++){ + for (x = 0; x < m; x++) + if (!(row[m * i + x] || col[m * j + x])) + break; + + row[m * i + x] = 1; + col[m * j + x] = 1; + printf("%d ", x); + } + printf("\n"); + } + + return 0; +} + +int main() +{ + int t = 1; + while (t--) + solve(); +} diff --git a/00_intro/19_knight_moves_grid/s.c b/00_intro/19_knight_moves_grid/s.c @@ -0,0 +1,124 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdint.h> + +struct payload { + int x; + int y; + int n; + int z; +}; + +struct node { + struct node *next; + void *payload; +}; + +struct node *new() +{ + struct node *n; + + n = malloc(sizeof(struct node)); + return n; +} + + +struct node *insert(struct node *tail, void *payload) +{ + struct node *node; + node = malloc(sizeof(struct node)); + node->payload = payload; + + tail->next = node; + return tail->next; +} + +struct node *pop(struct node *head) +{ + struct node *new_head; + + new_head = head->next; + free(head); + + return new_head; +} + +int *a; +int *b; + +int solve() +{ + const int moves[8][2] = { + {-2, -1}, + {-2, +1}, + {-1, -2}, + {-1, +2}, + {+1, -2}, + {+1, +2}, + {+2, -1}, + {+2, +1} + }; + + struct payload *payload; + struct node *head; + struct node *tail; + int i, j; + int n; + + scanf("%d", &n); + + payload = malloc(sizeof(struct payload)); + payload->x = 0; + payload->y = 0; + payload->n = n; + payload->z = 0; + + head = malloc(sizeof(struct node)); + head->payload = payload; + + tail = head; + + a = calloc(n * n, sizeof(int)); + b = calloc(n * n, sizeof(int)); + + b[0]= 1; + + do { + payload = head->payload; + for (i = 0; i < 8; i++) { + if (payload->x + moves[i][0] >= 0 + && payload->x + moves[i][0] < n + && payload->y + moves[i][1] >= 0 + && payload->y + moves[i][1] < n + && b[n * (payload->x + moves[i][0]) + payload->y + moves[i][1]] != 1 + ) { + struct payload *tmp; + tmp = malloc(sizeof(struct payload)); + a[n * (payload->x + moves[i][0]) + payload->y + moves[i][1]] = payload->z + 1; + b[n * (payload->x + moves[i][0]) + payload->y + moves[i][1]] = 1; + tmp->x = payload->x + moves[i][0]; + tmp->y = payload->y + moves[i][1]; + tmp->n = payload->n; + tmp->z = payload->z + 1; + tail = insert(tail, tmp); + } + } + head = head->next; + } while(head->next != NULL); + + for (i = 0; i < n; i++) { + for (j = 0; j < n; j++) + printf("%d ", a[n * i + j]); + printf("\n"); + } + + return 0; +} + +int main() +{ + int t = 1; + while (t--) + solve(); +} diff --git a/00_intro/20_grid_coloring/s.c b/00_intro/20_grid_coloring/s.c @@ -0,0 +1,46 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdint.h> + +int solve() +{ + int n, m; + int i, j; + int x; + + scanf("%d %d\n", &n, &m); + + int a[n + 1][m + 1]; + + memset(a, 0, sizeof(a)); + + int res[n][m]; + + for (i = 1; i < n + 1; i++) { + for (j = 1; j < m + 1; j++) { + a[i][j] = getchar(); + for (x = 'A'; x <= 'D'; x++) + if (x != a[i][j] && x != res[i-2][j-1] && x != res[i-1][j-2]) + break; + res[i-1][j-1] = x; + } + + getchar(); + } + + for (i = 0; i < n; i++) { + for (j = 0; j < m; j++) + printf("%c", res[i][j]); + printf("\n"); + } + + return 0; +} + +int main() +{ + int t = 1; + while (t--) + solve(); +} diff --git a/00_intro/21_digit_queries/.swp b/00_intro/21_digit_queries/.swp Binary files differ. diff --git a/00_intro/21_digit_queries/s.c b/00_intro/21_digit_queries/s.c @@ -0,0 +1,53 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdint.h> + +int solve() +{ + uint64_t acc; + uint64_t k; + uint64_t n; + uint64_t p; + uint64_t b; + uint64_t d; + int i; + int j; + + scanf("%llu", &k); + + if (k < 10) { + printf("%llu\n", k); + return 0; + } + + n = 9; + acc = 0; + b = 1; + + for (i = 1; i < 100; i++, n *= 10) { + acc += i * n; + if (k <= acc) + break; + b *= 10; + } + + p = (k - (acc - (i *n))) - 1; + n = b + (p / i); + d = p % i; + + for (j = 0; j < i - d - 1; j++) + n/=10; + + printf("%llu\n", n % 10); + + return 0; +} + +int main() +{ + int t; + scanf("%d", &t); + while (t--) + solve(); +} diff --git a/00_intro/22_string_reorder/s.c b/00_intro/22_string_reorder/s.c @@ -0,0 +1,29 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdint.h> + +int solve() +{ + char a[26] = {0}; + char s[1000001]; + char c; + int i; + int j; + + scanf("%s", s); + + i = 0; + + while ((c = s[i++]) != '\0') + a[c - 'A']++; + + return 0; +} + +int main() +{ + int t = 1; + while (t--) + solve(); +} diff --git a/00_intro/23_grid_path_description/s.c b/00_intro/23_grid_path_description/s.c @@ -0,0 +1,74 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdint.h> +#include <unistd.h> + +int a[9][9]; +char d[49]; +int res; + +void backtrack(int x, int y, int n, int prev) +{ + if (x == 7 && y == 1) { + if (n == 48) + res++; + return; + } + + if (prev == 1 && a[x-1][y] && !a[x][y+1] && !a[x][y-1]) + return; + + if (prev == 0 && a[x+1][y] && !a[x][y+1] && !a[x][y-1]) + return; + + if (prev == 3 && a[x][y-1] && !a[x+1][y] && !a[x-1][y]) + return; + + if (prev == 2 && a[x][y+1] && !a[x+1][y] && !a[x-1][y]) + return; + + a[x][y] = 1; + + if (x < 7 && !a[x+1][y] && (d[n] == 'D' || d[n] == '?')) + backtrack(x + 1, y, n + 1, 0); + if (x > 1 && !a[x-1][y] && (d[n] == 'U' || d[n] == '?')) + backtrack(x - 1, y, n + 1, 1); + + if (y < 7 && !a[x][y+1] && (d[n] == 'R' || d[n] == '?')) + backtrack(x, y + 1, n + 1, 2); + if (y > 1 && !a[x][y-1] && (d[n] == 'L' || d[n] == '?')) + backtrack(x, y - 1, n + 1, 3); + + a[x][y] = 0; + + return; +} + +int solve() +{ + int i; + + scanf("%s", d); + + for (i = 0; i < 9; i++) + a[0][i] = 1; + for (i = 0; i < 9; i++) + a[i][0] = 1; + for (i = 0; i < 9; i++) + a[8][i] = 1; + for (i = 0; i < 9; i++) + a[i][8] = 1; + + backtrack(1, 1, 0, 0); + + printf("%d\n", res); + return 0; +} + +int main() +{ + int t = 1; + while (t--) + solve(); +} diff --git a/00_intro/s.c b/00_intro/s.c @@ -0,0 +1,17 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdint.h> + +int solve() +{ + return 0; +} + +int main() +{ + int t; + scanf("%d", &t); + while (t--) + solve(); +} diff --git a/01_sorting_and_searching/00_distinct_numbers/s.c b/01_sorting_and_searching/00_distinct_numbers/s.c @@ -0,0 +1,99 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdint.h> + +/* TODO change this to a rbtree */ + +struct node { + struct node *l; + struct node *p; + int key; +}; + +struct node *add_node(struct node **headp, int key) +{ + struct node *tmp; + struct node *head = *headp; + + if (!head) { + head = malloc(sizeof(struct node)); + head->l = NULL; + head->p = NULL; + head->key = key; + return head; + } + + tmp = malloc(sizeof(struct node)); + tmp->l = NULL; + tmp->p = NULL; + tmp->key = key; + + while (1) { + if (key > head->key) { + if (head->p) + head = head->p; + else + break; + } else { + if (head->l) + head = head->l; + else + break; + } + } + + if (key > head->key) + head->p = tmp; + else + head->l = tmp; + + return tmp; +} + +int search_btree(struct node *head, int key) +{ + while (head) { + if (key == head->key) + return 1; + if (key > head->key) + head = head->p; + else + head = head->l; + } + return 0; +} + +int solve() +{ + struct node *head = NULL; + uint32_t res; + int n, i; + + scanf("%d", &n); + + res = 0; + for (i = 0; i < n; i++) { + int x; + + scanf("%d", &x); + if (!search_btree(head, x)) { + res++; + if (!head) + head = add_node(&head, x); + else + add_node(&head, x); + } + } + + printf("%u\n", res); + + return 0; +} + +int main() +{ + int t = 1; + while (t--) + solve(); +} diff --git a/01_sorting_and_searching/s.c b/01_sorting_and_searching/s.c @@ -0,0 +1,17 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdint.h> + +int solve() +{ + return 0; +} + +int main() +{ + int t; + scanf("%d", &t); + while (t--) + solve(); +}