1

(6 ответов, оставленных в Problems)

Причём Форд-Беллман не понятно smile
Могу только заметить, что расстояние между точками i и j это

max(abs(x[i] - x[j]), abs(y[i] - y[j]))

=> для каждой точки можно посчитать сумму расстояний за N и выбрать минимум. 
Быстрее не знаю sad

2

(6 ответов, оставленных в Problems)

Надо не -1, а -k, потому что это важно, на каком именно расстоянии произошло ближайшее снизу заражение.

Теперь при нахождении нужной вершины я сразу заражаю (помечаю) всех возможных от неё же.
Захожу в 1-го предка допустим -> заразил его (пометил все на расстоянии k ребёр) -> иду в следующего и смотрю какая сама глубокая непомеченая.
h[v] = -1 это теперь метка что в этом поддереве все нормально.

Но так уж и быть, попробую без пометок теперь)

UPD: написал правильное решение наконец)
Кстати, если мы заражаем вершину, то расстояние до ближайшей незаражённой - это -k-1, а не -k yikes
UPD2: забыл поблагодарить.
Спасибо огромное за помощь!

3

(6 ответов, оставленных в Problems)

Переписал код, теперь работает так: есть массив int h[], если h[v]==-1, то в поддереве всё заражено, иначе это расстояние то самой далёкой незаражённой и есть функция помечающая все заражённые вершины от источника.
И в зависимости от того помечена ли вершина и какое расстояние запучкаем заражение или нет.
Это теперь проходит большинство тестов, но на некоторых всё равно падает.
В общем вот http://ideone.com/2jOOo
Можете глянуть, если не сложно? Там немного.

4

(6 ответов, оставленных в Problems)

Да, я вроде так и делал. Но когда мы заразили текущую вершину, то от неё заражение пойдёт наверх во все достижимые вершины и в них тоже нужно быстро обновлять значения, как это корректно обойти?

5

(6 ответов, оставленных в Problems)

Дано неориентированное дерево (2*10^5 вершин) и число k. Мы можем заразить вершину и вместе с ней автоматически заразятся все вершины, удалённые от неё не более чем на k ребер. Нужно за минимальное число заражений заразить всё дерево.
Я пытался делать что-то типа динамики по поддеревьям: хранится информация, насколько удалёна последняя заражённая вершина от корня рассматриваемого поддерева и сколько в поддереве заражённых вершин. На основе этого мы обновляем эти значения для текущей вершины.
Но чувствую,что это лажа), проходит тестов 10.
Задача D отсюда http://neerc.ifmo.ru/school/io/archive/ … vidual.pdf
Бредокод здесь http://ideone.com/FuPnO

6

(3 ответов, оставленных в Problems)

Сдал, вот код: http://www.ideone.com/njVld

7

(2 ответов, оставленных в Algo)

Спасибо big_smile , сдал с такой идеей, но повозился с тем, что если мы, считая d[v][c], даже не попытались его обновить, то  d[v][с]=-inf, а если, считая все d[v][0..2], не попытались обновить хотя бы один, то решения не существует)
И ещё с тем, что ответ - это максимум из d[root][0..2] после всего обхода, так как некоторые значения могут превратиться в -inf по пути)

8

(2 ответов, оставленных в Algo)

Подскажите как решать такую задачу:
Дано дерево, для каждой вершины известно в какой из трёх цветов её можно покрасить, не разрешается смежные вершины красить в один цвет.
Нужно найти максимально возможное количество вершин первого цвета среди всех возможных раскрасок.
Спасибо.

9

(7 ответов, оставленных в Problems)

У меня наконец-то дошли руки до этой задачи!
Но столкнулся с проблемами (WA) при реализации дерева отрезков в виде:
- за O(logN) на отрезке прибавлять +-1
- за O(logN) возвращать максимум на всём массиве и его номер.
При замене дерева на линейное прибавление TL на больших тестах, т.е. ошибка в дереве отрезков.
Вот функция обновления(t - массив прибавлений, tmax - максимум на подотрезке, wmax - где находится текущий максимум на подотрезке):

 void update(int v,int tL,int tR,int l,int r,int add){
    if (l>r) return;
    if (tR==tL|(tL==l&tR==r)) {t[v]+=add;tmax[v]+=add;return;}
    int tM=(tL+tR)/2;
    update(v*2,tL,tM,l,min(r,tM),add);
    update(v*2+1,tM+1,tR,max(l,tM+1),r,add);
    tmax[v]=-99999999;
    if (tmax[v]<tmax[v*2+1]) {tmax[v]=tmax[v*2+1]+t[v];wmax[v]=wmax[v*2+1];}
    if (tmax[v]<tmax[v*2]) {tmax[v]=tmax[v*2]+t[v];wmax[v]=wmax[v*2];}
 }

Весь код: http://pastebin.com/JQbFsGCD
UPD:Игнор

10

(12 ответов, оставленных в Problems)

Спасибо, я сначала не в ту сторону думал по ходу.

11

(12 ответов, оставленных в Problems)

Получается генерируются только всевозможные формы областей, т. е. для k=3 будет
1. ###  2. #   3.##   4.#      5.   #    6. ##       ?
               #     #        ##       ##          #
               #

12

(12 ответов, оставленных в Problems)

Я не понял про генерацию различных связных областей:
1. Очередь кандидатов очищать при вызове перебора от новой точки?
2. Почему сначала в очереди (0,0), ведь рядом с ней может не быть кнопок?
3. Непонятно вообще как собственно перебирать: если мы берём точку, то как именно перебор пробует взять её, он же должен её брать, так как она соседствует со связной областью? Если добавляем точку в очередь , то перебор вызвать от неё? Остановка когда в очереди k элементов?

13

(12 ответов, оставленных в Problems)

Спасибо за подробные ответы!
Буду пробовать.

14

(12 ответов, оставленных в Problems)

Спасибо!
А можно поподробнее про генерацию замков: т.е. для максимум k=10 и поля 30*30 генерируем все множества
из 900 по 10 и отбираем те, что образуют связную область?

15

(12 ответов, оставленных в Problems)

Вот http://informatics.mccme.ru/moodle/mod/ … rid=3022#1
Бьюсь с ней, но никак даже несколько тестов не проходит.
Пытался сделать обходом в глубину из кнопки, но так теряются ответы.
Подскажите как решать!

16

(0 ответов, оставленных в Problems)

Вот задача:http://codeforces.ru/contest/6/problem/D.
Не придумывается алгоритм решения.
В других некоторых сданных программах используется dfs, но непонятно как связать с графом.
Хотя, видимо, решается динамикой.
Наведите на путь решения!

17

(2 ответов, оставленных в Problems)

Разве надо сортировать, если точки даны как многоугольник без самопересечений в порядке обхода против часовой стрелки?

18

(2 ответов, оставленных в Problems)

Задача: дан многоугольник без само пересечений (все вершины различны, количество вершин от 3 до 1000,координаты от -10000 до 10000, вершины в порядке следования против часовой) и расстояние (от 1 до 1000), ближе которого не может подходить к многоугольнику непрерывная линия . Нужно найти минимальную длину этой линии.
Я сначала строю выпуклую оболочку: ищется нижняя правая точка (она точно входит в оболочку) и от неё строится оболочка (обходом всех вершин с проверкой на правый поворот).
Получается неправильный ответ на 8 тесте.
Подскажите, что не так.

TYPE t=record
     x,y:real;
     end;
var f,f1:text;  d,a:array[1..2010] of t; n,l,k,i,min:integer; r:real;


function ok(a,b,c:t):boolean; {правда - если с справа от вектора ab и наоборот}
begin
if (a.x-c.x)*(b.y-c.y)+(b.x-c.x)*(c.y-a.y)<0 then ok:=true else ok:=false;
end;

function len(a,b:t):real;
begin
 len:=sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
end;

begin
 reset(f,'wall.in');
 rewrite(f1,'wall.out');
 read(f,n,l);
 min:=1;
 for i:=1 to n do begin
  read(f,d[i].x,d[i].y);
  if (d[i].y<d[min].y) or ((d[i].y=d[min].y) and (d[i].x<d[min].x)) then min:=i;
 end;
 close(f); {считаны точки и найден минимум(крайняя снизу и справа точка)}
 for i:=1 to min-1 do d[n+i]:=d[i];
  {теперь элементы упорядочены относительно минимума}

  a[1]:=d[min];  a[2]:=d[min+1]; k:=3;

 for i:=min+2 to n+min-1 do
  if ok(a[k-2],a[k-1],d[i]) then begin a[k]:=d[i]; inc(k) end else a[k-1]:=d[i];

  r:=0;k:=k-1;
  for i:=1 to k-1 do r:=r+len(a[i],a[i+1]);
  r:=r+len(a[1],a[k]);

 write(f1,r+2*pi*l:0:16);
 close(f1);
end.

Там же я написал что сдал её по этой ссылке (первоначальный вариант).
А другую версию не могу дать ссылку, туда вход для тех, кто ходит в кружок

Где вы сдавали?

Добавил проверку - ничего не изменилось(

Я просто её уже сдал другим алгоритмом, а с этим уже голову сломал..
А кто такие мультирёбра?

23

(2 ответов, оставленных в Algo)

Спасибо, уже за день сам до этого додумался:)

Минимум инициализируется min:=high(int64) в начале каждого прохода, а в процессу пробега вершин он по любому найдёт вершину равную high(int64).

25

(2 ответов, оставленных в Algo)

Дан многоугольник координатами своих вершин и расстояние, ближе которого не может подходить в нему непрерывная кривая. Как найти длину этой кривой, подскажите алгоритм или где почитать про подобные задачи. В Инете ничего толкового по этому поводу не нашел. Плохо искал видимо)