Блог пользователя Egor

Автор Egor, 14 лет назад, По-русски
На этих выходных состоится второй этап VIII Открытого Кубка по программированию им. Е. В. Панкратьева. Основной день для написания - 19 сентября в 11:00 MSD. Всем удачи
  • Проголосовать: нравится
  • 0
  • Проголосовать: не нравится

14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
В E видимо надо было использовать алгоритм поиска определителя, который не использует деление?

Как решалась J?
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Предполагалось, да
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Основная идея в J -- что туда надо прикрутить дерево интервалов с RMQ или чем-то подобным. Кодить довольно неприятно и много.
    Проще всего как-то так: разобьём планеты на максимальные по включению интервалы (т.е. если попали в интервал, то его весь облететь сможем, а всё остальное -- уже нет) и оффлайн обработаем все запросы.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
А как решалась задача F?
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Например декартовым деревом.
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      В задаче F (про НОД) что будет ответом на тест :
      6
      +6
      +8
      -6
      -8
      +9
      +3
      6 2 8 1 1 1 или 6 2 8 1 9 3
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
      • 14 лет назад, # ^ |
          Проголосовать: нравится +1 Проголосовать: не нравится
        6 2 8 1 9 3
        • 14 лет назад, # ^ |
            Проголосовать: нравится -10 Проголосовать: не нравится
          Вот моё решение :
          var n,i,lik,nod,kol,t,op:longint;
          a:array of longint;
          b:array of longint; sim:char;
          function nodob(a,b:longint):longint;
          begin
          while (a<>0) and (b<>0) do
          if a>b then a:=a mod b else b:=b mod a;
          nodob:=a+B;
          end;
          procedure Swap(Var t,y:longint);
          var u:longint;
          begin u:=t; t:=y; y:=u; end;
          procedure Sort(l,r:longint);
          var i,j,x:longint;
          begin
          x:=a[(l+r) div 2]; i:=l; j:=r;
          repeat
          while a[i]<x do inc(i);
          while a[j]>x do dec(j);
          if i<=j then begin Swap(a[i],a[j]); Swap(b[i],b[j]); inc(i); dec(j); end;
          until i>j;
          if l<j then Sort(l,j);
          if i<r then Sort(i,r);
          end;
          function BIN(lik:longint):longint;
          var l,r,sredn:longint;
          begin
          l:=1; r:=kol; sredn:=(l+r) div 2;
          while r-l>1 do
          begin
          if a[sredn]=lik then begin Bin:=sredn; exit; end
          else
          if lik<a[sredn] then r:=sredn else l:=sredn;
          sredn:=(l+r) div 2;
          end;
          if a[l]=lik then begin BIN:=l; exit; end;
          if a[l+1]=lik then begin BIN:=l+1; exit; end;
          BIN:=0;
          end;
          begin
          assign(input,'input.txt');
          reset(input);
          assign(output,'output.txt');
          rewrite(output);
          readln(n);
          SetLength(a,n+2);
          SetLength(b,n+2);
          kol:=0; NOD:=0;
          for op:= 1 to n do
          begin
          readln(sim,lik);
          case sim of
          '+':begin
          t:=BIN(lik);
          if t=0 then begin
          inc(kol);
          a[kol]:=lik; b[kol]:=1;
          Sort(1,kol);
          if kol=1 then nod:=lik else
          nod:=nodob(nod,lik);
          end else
          begin
          inc(b[kol]);
          end;
          end;
          '-':begin
          t:=BIN(lik);
          if b[t]>1 then begin
          dec(b[t]);
          end else
          begin
          a[t]:=0; b[t]:=0;
          for i:= t to kol-1 do
          begin
          a[i]:=a[i+1];
          b[i]:=b[i+1];
          end;
          dec(kol);
          if kol=0 then begin nod:=1;
          end else
          begin
          nod:=a[1];
          for i:= 2 to kol do
          begin
          nod:=nodob(nod,a[i]);
          if nod=1 then break;
          end;
          end;
          end;
          end;
          end;
          writeln(nod);
          end;
          close(inpuT); close(output);
          end.
          Почему у меня WA на 4 тесте.
          • 14 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            Пожалуйста, используйте http://pastebin.org
            • 14 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится
              • 14 лет назад, # ^ |
                  Проголосовать: нравится 0 Проголосовать: не нравится
                А что это такое ? По-русски объясни.
                • 14 лет назад, # ^ |
                    Проголосовать: нравится 0 Проголосовать: не нравится
                  Туда код свой вставляешь и даешь тут ссылку на него. А она сохраняет отступы и подсвечивает синтаксис. В том, что ты прислал совершенно невозможно что-нибудь понять.
                  • 14 лет назад, # ^ |
                      Проголосовать: нравится 0 Проголосовать: не нравится

                    • 14 лет назад, # ^ |
                        Проголосовать: нравится +5 Проголосовать: не нравится
                      Спасибо за объяснения! Кратко мой план решения таков:
                      1. Запоминал не только какое число добавлял, но и его количество.
                      2. При считывании входных данных если «+», и элемента ещё не было, искал НОД добавляемого числа и уже имеющийся НОД.
                      3. При «-», если такое число было в списке, ничего не делал, если удаляемое число являлось последним – пересчитывал НОД начиная с самых маленьких чисел.
                      4. Все мною созданные тесты программа проходит. Но все равно WA на 4 тесте.


                      • 14 лет назад, # ^ |
                          Проголосовать: нравится 0 Проголосовать: не нравится
                        Почему ты считал начиная с маленьких чисел, а не с больших?
                        • 14 лет назад, # ^ |
                            Проголосовать: нравится 0 Проголосовать: не нравится
                          Потому что НОД быстрее станет равным 1, ибо нельзя подобрать много чисел среди которых найдутся взаимнопростые.
                          Я нашёл свою ошибку и теперь у меня TLE на 17 тесте. Мне кажется что эту задачу простым массивом не сделаешь, а необходимо строить декартово дерево для ускорения работы по массиву. Или я не прав?
                • 14 лет назад, # ^ |
                    Проголосовать: нравится 0 Проголосовать: не нравится
                  Только содомиты вставляют неотформатированный код в пост.
                  • 14 лет назад, # ^ |
                      Проголосовать: нравится 0 Проголосовать: не нравится
                    просто codeforces из отформатированного кода сделал неотформатированный
          • 14 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            100000
            +10000
            +20000
            +30000
            +40000
            ...
            +500000000
            +50
            -50
            +50
            -50
            ...
            +50
            -50

            Вот это должно медлленно работать :)
            • 14 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится
              Да, программа на Вашем тесте работает действительно долго.
              Я даже не знаю как её можно ускорить. Все ресурсы исчерпал.
  • 14 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится
    Я сначала сжал x во входных данных, а потом использовал дерево отрезков, где хранил НОДы.
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      можно немного поподробнее? спасибо
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Представь себе, как бы ты написал дерево отрезков с операцией '+' (сложение).
        Теперь напиши всё то же самое, то операцией сделай НОД.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Может кто-нибудь подсказать, как делать Q из дива 2? Заранее спасибо)
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Перебираем центральный элемент подматрицы (в случае нечетного размера) или центральную часть 2x2 (в случае четного размера). Пока возможно, пытаемся увеличить подматрицу. На каждом шаге увеличиваем размер на два, и проверяем, что верхняя строка равна перевернутой нижней, а левый столбец равен перевернутому правому. Получается алгоритм за O(N^4). Чтобы он зашёл, надо оптимизировать сравнение строк и столбцов. Например, с помощью битовых масок можно уменьшить число итераций в 64 раза.
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      В задаче Q кажется длина строки не всегда равна M. Ибо у меня RE, и ассерты на равенство M не проходят. Возможно, я как-то замудрил, но может и в тестах косячок закрался...
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Добавил проверку длины строк, получил TLE на 5-м тесте.

        Но если вводить посимовольно через scanf(" %c", ...), то нормально заходит.
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Это как бы уже неправильно. Я читал так:
          v[i] = ns().toCharArray();
          RE - 7. 

        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Проверку в каком смысле? в 5-ом тест получается всё равно количество 0/1 меньше, чем M. Если бы мусор был бы в строке - его можно откинуть, а что делать в таком случае?
          • 14 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            Проверку в смысле делать TLE, если длина строки не равна C.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Может кто знает в чем особенность теста 21 в задаче I(кролики)?
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
     У меня тоже не проходит 21 тест (TLE). Я определял на каждом луче сколько ему принадлежит точек. Это - не рациональный перебор. Быстрее перебрать точки не получается. Как же все-таки убить наибольшее количество зайцев быстрее?
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      нене у нас WA. там решение n^2 log(n). Если нужно могу рассказать как это делается.
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Если можно, то расскажите поподробнее как это делается у Вас..
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Во-первых разных векторов может быть 21^2.(координаты по модулю < 10)
          Для каждого такого вектора v, разобьем всех кроликов на классы эквивалентности относительно этого вектора. (отношение эквивалентности: A~B - |A-B| || v.
          Отсортируем точки внутри каждого класса эквивалентности по x, потом по y. Теперь мы для запроса мы можем определить: класс эквивалентности в котором лежит точка выстрела за O(1), и сколько точек лежит на этом луче O(log n) - бинарным поиском.

          Как по точке (x, y)определить класс эквивалентности относительно вектора (a, b): с = -b * x + a * y;
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Нужно заметить, что возможных направлений не так и много.
      Для выбранного направления достаточно посортить все точки как если бы это направление было осью абсцисс и дальше бинпоиском найти то, что просят.
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        А как посортить все точки для выбранного направления, если это направление ось? Спасибо.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Может кто-нибудь выложить задачи?
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Помогите с G, я подозреваю, что динамика, но никак не могу подобрать параметры и переходы...
  • 14 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится

    Нет, там главное, - понять, что из-за МСТшности степень каждой вершины небольшая. Вооружившись этим фактом, понятно, что можно писать динамику по маскам в каждой вершине, либо даже всякое палево типа random_shuffle :)


    Почему степень маленькая? Можно понять, что максимальная она - когда у текущей вершины ровно 6 соседей, расположенных в виде правильного 6-угольника (потому что тогда каждый треугольник, образованный двумя соседями и самой вершиной, является правильным), а если их больше - то уже становится невыгодно соединять соседей именно с текущей вершиной (как-нибудь по неравенству треугольников что ли доказать это можно). На самом деле, в тестах и вовсе все степени не превосходят пяти, поскольку 6-угольник сделать из челочисленных координат, мягко говоря, проблематично :)