Задача A

Вроде бы легко , но если задуматься...
Вроде бы легко , но если задуматься...

Условие (кратко):

(a+c) принадлежит (b+c)

Вводные данные : a b
Найти: c

Рассуждение:

  1. Если нам надо найти (a+c) принадлежащее (b+c) , нам надо работать со строками.

    1. Как найти c?
      На ум приходит 2 варианта.
      1. Генерировать кандидитов C (через цикл или отдельно выделенный массив)
      2. Использовать алгоритм для поиска подстроки
      3. Использовать RegEx

      Так давайте же комбинировать наши идеи.
      Чтобы решить задачу мы можем:
      1. Скомбинировать 1 и 2
      2. Скомбинировать 1 и 3

  2. У нас олимпиада , так что времени в обрез , поэтому зачем мучать себя алгоритмом поиска подстроки , если велосипед придумали до тебя.

Решение(так , как я джавист все решения будут предоставлены на java):

```

import java.util.Scanner;
import java.math.BigInteger;
import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
      // я выбрал именно тип BigInteger ибо числа могут быть запредельно большими для int
        BigInteger a = new BigInteger(scanner.next());
        BigInteger b = new BigInteger(scanner.next());
        scanner.close();

        
        boolean found = false; // делаем флажочек , это так как я их называю для того чтобы выводить -1

        for (int len = 0; len <= 5; len++) {  
          
            int limit = (int) Math.pow(10, len);
          
            for (int c = 0; c < limit; c++) { // генерируем кандидатов , как я и говорил
              
                BigInteger C = BigInteger.valueOf(c); 
              
                String x = a.add(C).toString(); 
                String y = b.add(C).toString();

                Pattern pattern = Pattern.compile(Pattern.quote(x)); // создаем pattern по которому будет происходиться поиск  , в данном случае у нас это a , то есть переменная x
                Matcher matcher = pattern.matcher(y);

                if (matcher.find()) { // ищем по pattern через обьект matcher
                    System.out.println(c); // если нашло печатает
                    found = true; // если нашло в 40 строке кода -1 не напечатает
                    return; // выходит из функции
                }
              
            }
        }

        if (!found) {
            System.out.println(-1);
        }
    }
}

Задача B

Условие(кратко):

Вводные данные:
n k
a1 a2 a3 a4 .. ai
q
[1 or 2 or 3] if 1 ix if 2 l r if 3 l r

Выход:
Для каждого 3 типа запроса вывести результат , то есть сумму в которую обойдутся вам все товары.

Рассуждения:

  1. Надо спарсить данные

  2. Составить таблицу с номером_тороговца : цена_уник_товара

  3. По сформированной таблице запросов:

    1. Если нам прилетел 1 , то просто приравниваем к таблице торговцев цену товара

    2. Если прилетел 2 , то инвертируем с l по r цены у торговцев. С l по R это номер торговца.

    3. Если прилетел 3 выводим сумму

Решение

import java.util.HashMap;
import java.util.Scanner;
 
public class B_Solution {
 
    private final HashMap<Integer, Integer> traders = new HashMap<>();
    private int k;
 
    public void solve() {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        k = sc.nextInt();
 
        for (int i = 1; i <= n; i++) {
            int p = sc.nextInt();
            traders.put(i, p);
        }
 
        int q = sc.nextInt();
        for (int qi = 0; qi < q; qi++) {
            int type = sc.nextInt();
            int l = sc.nextInt();
            int r = sc.nextInt();
            if (type == 1) {
                traders.put(l, r);
            } else if (type == 2) {
                for (int i = l; i <= r; i++) {
                    int v = traders.get(i);
                    traders.put(i, invert(v, k));
                }
            } else if (type == 3) {
                int sum = 0;
                for (int i = l; i <= r; i++) {
                    sum += traders.get(i);
                }
                System.out.println(sum);
            }
 
        }
        sc.close();
    }
 
    public static int invert(int x, int k) {
        int mask = (1 << k) - 1;
        return (~x) & mask;
    }
 
    public static void main(String[] args) {
        new B_Solution().solve();
    }
}

ПС: Да , я знаю ,что вместо regex можно было использовать contains. А вместе hashmap просто массив ,но я выкладываю нерациональные решения , которые я сделал в стрессе. Ибо так вы можете поразмышлять , как можно было бы сделать лучше. И начать думать и понять мое решение получше.

Комментарии (0)