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

Автор Polichka, 15 лет назад, По-русски
Задача A

Так как на первом месте должен стоять солдат с максимальным ростом, то логично поставить на первое место самого левого солдата с максимальным ростом, чтобы минимизировать время (число обменов). Исходя из таких же соображений на последнее место поставим самого правого солдата с минимальным ростом. Таким образом количество обменов это номер самого левого солдата с максимальным ростом  - 1 + n -  номер самого правого солдата с минимальным ростом. И если самый левый солдат с максимальным ростом стоит правее самого правого с минимальным ростом, то из этой суммы нужно вычесть один.

Задача B

Переберем все точки, в которых сидят генералы, и посчитаем количество не покрываемых никакой окружностью. Пусть xa < xb и ya < yb, если это не так, то просто поменяем xa и xb, ya и yb местами. Тогда генералы сидят в точках: (xa, y), (xb, y), (x, ya), (x, yb), где xa ≤ x ≤ xb и ya ≤ y ≤ yb. При подсчете ответа нужно аккуратно посчитать генералов, которые сидят в точках (xa, ya), (xa, yb), (xb, ya), (xb, yb), чтобы не учесть их дважды.

Задача C

Посчитаем количество каждой из букв во второй строке и сохраним это, например, в массив a[1..26]. Для первой строки для префикса длины, равной длине второй строке, (это первая подстрока) посчитаем в массив b[1..26] количество каждой из букв. Знаки вопроса в массиве b не будем учитывать. Если для всех i выполняется b[i] ≤ a[i], то значит это хорошая подстрока. Далее перейдем ко второй подстроке: вычтем из массива b первый символ: b[s[1] - 'a' + 1] –  и прибавим n + 1 символ, если n --- длина строки p: b[s[n + 1] - 'a' + 1] +  + . Если какой-либо из этих символов вопрос, то для него прибавление или вычитание делать не нужно. Далее повторяем выше рассмотренную проверку и переходим к следующей подстроке. Повторяем эти действия, пока не переберем все подстроки строки s длины n.

Задача D

d[i] --- минимальные расстояния от вершины s до вершины i, посчитанные с помощью алгоритма Дейкстры. 
Далее переберем все ребра графа, и для каждого из них посчитаем количество точек, не совпадающих с вершинами, лежащих на них, находящихся на расстоянии l от вершины s (причем l - минимальное расстояние от этих точек). 

Рассмотрим ребро (u, v):

если d[u] < l и l - d[u] < w(u, v) и w(u, v) - (l - d[u]) + d[v] > l, то прибавим к ответу точку, лежащую на этом ребре на расстоянии l - d[u] от вершины u;

если d[v] < l и l - d[v] < w(u, v) и w(u, v) - (l - d[v]) + d[u] > l, то прибавим к ответу точку, лежащую на этом ребре на расстоянии l - d[v] от вершины v;

если d[v] < l и d[u] < l и d[u] + d[v] + w(u, v) = 2 * l, то прибавим к ответу точку, лежащую на этом ребере на расстоянии l - d[u] от вершины u и l - d[v] от вершины v.

Также если d[i] = l, то прибавим к ответу вершины.

Задача E

Рассмотрим каждого спортсмена в отдельности. Очевидно, что мы можем по координатам спортсмена понять: какие клетки на побочной диагонали являются ближайшими к нему, они образуют "отрезок" на побочной диагонали. Выпишем для каждого спортсмена эти отрезки.

Выберем спортсменов так, чтобы каждому из них мы могли сопоставить ровно одну клетку на побочной диагонали из его "отрезка", и каждой клетке на побочной диагонали соответствовал не более, чем один спортсмен. Понятно, что спортсмены смогут дойти до "своих" клеток, не побывав с кем-либо на одной клетке. Осталось максимизировать количество выбранных спортсменов. Таким образом переформулированная задача решиется жадно.
Разбор задач Codeforces Round 103 (Div. 2)
  • Проголосовать: нравится
  • +51
  • Проголосовать: не нравится

»
15 лет назад, скрыть # |
← Rev. 3  
Проголосовать: нравится +2 Проголосовать: не нравится

Чтобы в D не рассматривать случаи, можно было на каждом ребре (u,v) добавить вершину между u и v на расстоянии l - d[u]  и l - d[v] (пара проверок, чтобы новые вершины не совпали и существовали) и запустить Дейкстру ещё раз.

»
15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

>> ... посчитанные с помощью алгоритма Дийкстры.

Поправьте, пожалуйста.

»
15 лет назад, скрыть # |
 
Проголосовать: нравится +3 Проголосовать: не нравится
Thank you for the contest and fast published tutorial :-)
»
15 лет назад, скрыть # |
 
Проголосовать: нравится +1 Проголосовать: не нравится
Actually I'm confused by how to greedy in Pro E... I have worked out the convertion, but didn't know how to solve the "segment" problem. THX
»
15 лет назад, скрыть # |
← Rev. 2  
Проголосовать: нравится 0 Проголосовать: не нравится

UPD. Большой вопрос под спойлером. Уже решён.

  • »
    »
    15 лет назад, скрыть # ^ |
     
    Проголосовать: нравится +3 Проголосовать: не нравится
    Так точка не обязательно на середину должна попадать, если она одна. Пример: до одного конца ребра расстояние 1, до другого 3, длина ребра 4.
»
15 лет назад, скрыть # |
 
Проголосовать: нравится +7 Проголосовать: не нравится
" Понятно, что спортсмены смогут дойти до "своих" клеток, не побывав с кем-либо на одной клетке. " - достаточно неформальное доказательство, не так ли?:)
И как именно "жадно" решалась Е?
  • »
    »
    15 лет назад, скрыть # ^ |
    ← Rev. 2  
    Проголосовать: нравится +12 Проголосовать: не нравится

    Ну на самом деле это практически очевидно. 

    А Е решалась так: сортируем полученные интервалы, затем пробегаем по точкам от 1 до n и для каждой точки берём по одному отрезку, если таковые есть под данной точкой - стандартная задача, похожа на вот эту http://e-maxx.ru/algo/covering_segments . А я вообще делал эту задачу иначе :) Закинул n точек в set, отсортировал точки по рядам затем по столбцам и для каждого интервала (l,r) находил максимальную точку из оставшихся, которая лежит в этом интервале (методом lower_bound), и удалял её.

    • »
      »
      »
      15 лет назад, скрыть # ^ |
       
      Проголосовать: нравится 0 Проголосовать: не нравится
      но допустим жадность придумать несложно, но вот как доказать (более четко), что пути спортсменов не пересекуться
      • »
        »
        »
        »
        15 лет назад, скрыть # ^ |
        ← Rev. 2  
        Проголосовать: нравится 0 Проголосовать: не нравится

        UPD. Под спойлером доказательство на пальцах. Лучше читайте ниже..

      • »
        »
        »
        »
        15 лет назад, скрыть # ^ |
         
        Проголосовать: нравится +15 Проголосовать: не нравится
        1. Спортсмены стартующие с разных диагоналей не пересекаются - очевидно.
        2. Рассмотрим всех спортсменов на какой-то фиксированой диагонали в порядке возрастания y ( x убывают в этом случае), отсортируем конечные точки на побочной диагонали в том же порядке возрастания y и сопоставим спортсменам - очевидно при таком разбиении пути не пересекутся, если спортсмены сначала будут ходить только по вертикали, а потом только по горизонтали  
      • »
        »
        »
        »
        15 лет назад, скрыть # ^ |
         
        Проголосовать: нравится +15 Проголосовать: не нравится

        во-первых заметим, что спортсмены, которые стоят на разных диагоналях (параллельных побочной) никогда не окажутся в одной клетке, т.к. если  идти по кратчайшему пути, то каждый раз спортсмен должен переходить на более близкую к последней диагональ.

        Теперь рассмотрим спортсменов и их пункты назначения на некоторой диагонали. Понятно, что и спортсмены и их пункты назначения будут идти в одинаковом порядке на диагоналях, иначе они обязательно пересекутся. Теперь каждый спортсмен идет до  нужного столбца влево, потом вверх. Очевидно, что если они будут двигаться таким образом, то пути не пересекутся

»
15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
Никак не могу найти ошибку в своем решении на задачу D 1083266 (
Может кто-нить заметит в чем проблема?

»
15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
I still don't know about the solution to the Pro-E "segment" problem.Could you explain it more clearly?
Thanks a lot.
»
15 лет назад, скрыть # |
← Rev. 2  
Проголосовать: нравится +3 Проголосовать: не нравится

Very sad that its impossible to get Accepted on problem B with Ruby.

Here is my code, may be some optimizations?
»
15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
How to prove the correctness of problem A.
I simulate 2 times.
  • »
    »
    15 лет назад, скрыть # ^ |
     
    Проголосовать: нравится 0 Проголосовать: не нравится
    The solution is a greedy approach which is proved by contradiction. Consider the best case and assume it's not the one that your algorithm produces and then come up with a contradiction to prove its correctness.
»
15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
У одного человека из моей комнаты увидел алгоритм Дийкстры с queue вместо priority_queue http://codeforces.me/contest/144/submission/1079923
Дийкстру так можно писать?
»
15 лет назад, скрыть # |
← Rev. 2  
Проголосовать: нравится 0 Проголосовать: не нравится

В разборе задачи D прибавляем к ответу точку по 3 условиям
d[u] < l и l - d[u] < w(u, v) и w(u, v) - (l - d[u]) + d[v] > l. Но зачет 3 -е условие, что оно дает?

Предположим d[i]=7, d[j]=3 a[i,j]=9 l=10. Почему я не могу из i отложить 3 и добавить его в ответ???

  • »
    »
    15 лет назад, скрыть # ^ |
    ← Rev. 5  
    Проголосовать: нравится 0 Проголосовать: не нравится

    Третьим условием мы проверяем корректность точки отстающей от u на расстояние l - d[u].
    l - d[u] - расстояние от точки до u;
    w(u, v) - (l - d[u]) - расстояние от этой точки до v;
    w(u, v) - (l - d[u]) + d[v] - расстояние, если идти в искомую точку из s в v и по ребру (u,v);
    w(u, v) - (l - d[u]) + d[v] <= L - это значит, что проходя через v мы можем прийти в точку по более короткому пути и она нам не подходит!

»
15 лет назад, скрыть # |
← Rev. 3  
Проголосовать: нравится 0 Проголосовать: не нравится

Can somebody help me with this (code) problem (C) ?

Something strange starts from test #13 (look at input params).

From problem statement:
The first line is non-empty string s, consisting of no more than 105 lowercase Latin letters and characters "?". The second line is non-empty string p, consisting of no more than 105 lowercase Latin letters.

PS.
Got Accepted, but the question remains.
»
15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
Hello! I want to know why the Pro-D could use Dijkstra to solve? That the  complexity of Dijkstra is O(v^2), isn't it ? And this time , |V| <= 10^5. 
thanks, Happy new year ~!~
»
9 месяцев назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

Hello, I wrote the solution of this problem in java but it is giving me wrong answer on test 4 on codeforces, even though its output is correct, if anybody figured out what is the bug please share his/her foundings, thank you. ~~~~~~~~~~~~~~~~~~~~~~ import java.util.*;
public class Arrival_of_the_General144A {

public static void main(String[] args) {

 Scanner scan= new Scanner(System.in);
 int n = scan.nextInt();
 int[] heights = new int[n];
 int max=0;
 int min=1000;
 int maxi =0;
 int mini=n-1;
 for(int i=0; i<n; i++) {
     heights[i]= scan.nextInt();
      if (heights[i]>max) {
          max=heights[i];
          maxi=i;}}

      for (int i=n-2; i>=0;i--) {
      if(heights[i]<min) { 
          min= heights[i];
          mini= i; }}

      int minmoves = n-1-mini;
      int maxmoves = maxi;
      int moves= maxmoves + minmoves;
      if(maxi>mini) { moves--;}
      System.out.println(moves);
      scan.close();}
 }

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
»
4 месяца назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

i really stucked, thank you for this :)