51

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

Хм... Ну на эту задачу я попробовал написать заливку снаружи,то есть выбираю в какой цвет покрашу и начинаю это делать снаружи,так как слои окрашиваться будут именно так,и выбираю ответ минимальный..
Прошла с первого раза,сложность O(N * M).

52

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

А что сделать то надо? Откуда в теме про радиус,вообще заливка появилась? Не понимаю.

53

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

big_smile

54

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

Вот теперь спасибо,эту задачу я уже решал..
Решение такое,найдём где наша медиана в массиве (она там одна,все числа различны).
Теперь пробежим от неё вправо попутно прибавляя +1 к разности кол-ва больших её чисел - кол-во меньших её чисел.
Теперь начнём бежать так же влево,и попутно зная разность кол-ва больших и меньших её чисел,можем узнать сколько краёв справа медианы даст нам такой отрезок что в нём кол-во больших и кол-во меньших чисел равны!
Получаем суть решения в том,что бы каждый момент знать при фиксированном левом крае,кол-во краёв справа медианы,которые в сумме дают равное кол-во больших и меньших чисел медианы,тем самым это и есть свойство медианы.
Сложность алгоритма и память O(N).

Реализация на Паскале(PASCAL):

var a:array[0..100010]of longint;
 r:array[-100010..100010]of longint;
 id,k,k2,i,n,md:longint;
 ans:int64;
begin
 read(n,md);
 for i:=1 to n do begin
  read(a[i]);
  if(a[i]=md)then id:=i;
 end;
 k:=0; k2:=0;
 fillchar(r,sizeof(r),0);
 for i:=id to n do begin
  if(a[i]>md)then inc(k) else if(a[i]<md)then inc(k2);
  inc(r[k-k2]);
 end;
 ans:=0; k:=0; k2:=0;
 for i:=id downto 1 do begin
  if(a[i]>md)then inc(k) else if(a[i]<md)then inc(k2);
  inc(ans,r[k2-k]);
 end;
 writeln(ans);
end.

55

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

chum пишет:

переберем все длины подпоследовательностей K и для каждой посчитаем ответ деревом отрезков как для k-й порядковой (но только такой, чтобы в ней содержался элемент множ-во А, равный М).

Не самый лучший вариант!

А можно всё таки ссылку на условие? Или автор темы взял из головы задачу??

56

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

Нет smile Геморно писать всё это ...
В интернете должно быть ):

57

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

Ссылку на условие пожалуйста!

58

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

То что ты описал волне сойдёт для Декартова дерева,если конечно ты подразумевал под add(x), delete(x) удаление числа из списка чисел.
Декартово дерево

59

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

Как я знаю это NP-полная задача,то что он ориентированный,нам как бэ ничего не даёт lol

60

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

smile:):) Эх Годы smile)

61

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

Ну ArcTan функция возрастающая,поэтому если сместить точки в плоскости (1,4) - что легко делается,то можно сортировать по x/y,а соотвественно при сравнении углов,можно избавиться от деления,так что тоже получит всё в целых числах.

62

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

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

Как написать сортировку по углу:
# Найдём самую левую-нижнюю точку,и сместим её в (0,0) и остальные координаты (на нужную величину). (Не обязательно делать).
# Теперь допустим есть точка (x,y) тогда угол для неё будет ArcTanges(Y / X).

63

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

Ааа smile Да забыл сказать,чувствительно к регистру (:

type Tlong=record n:longint;
 a:array[0..100]of longint;
end;

procedure multLong(var c:Tlong; a,b:Tlong);
 var i,j:longint;
 begin
  fillchar(c,sizeof(c),0);
  c.n:=a.n+b.n+2;
  for i:=1 to a.n do
  for j:=1 to b.n do
   inc(c.a[i+j-1],a.a[i]*b.a[j]);
  for i:=1 to c.n-1 do
   if(c.a[i]>9)then begin
    inc(c.a[i+1],c.a[i] div 10);
    c.a[i]:=c.a[i] mod 10;
   end;
  while(c.n>1)and(c.a[c.n]=0)do dec(c.n);
 end;

Вот реализация на Pascal smile
Мне лень на Си++ писать!

65

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

Ты прав smile Я думал человек догадался smile

66

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

ace.delos.com
Если тебе нужно узнать тесты или решения (разборы воощем) на задачи (всех дивизионов)
например Январь 2009,то пишешь
ace.delos.com/JAN09

Конечно парасочетания.
Делаешь две доли (доля-x, доля-y).
Делаешь ребро между двумя вершинами,если они подходят под описанное ограничение(|xi - yj| <= eps).
Теперь тебе нужно найти в данном графе максимальное парасочетание.
На этом сайте описано много алгоритмов для нахождения.
Например будет удобно использовать
Метод Куна

68

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

http://www.softtime.ru/cpp_info/stl.php
Вот.

69

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

http://msdn.microsoft.com/ru-ru/magazine/cc163451.aspx
http://www.cyberguru.ru/programming/cpp … age18.html

Почитай вот это думаю ты поймёшь,а так pair связывает каких-то две структуры,или сами же pair.
В твоём случае он связывает ценность ребра и направление ребра,поэтому
pair< int, pair< int, int > > - первый int - цена,второй int - откуда,третий int - куда.
Таким же образом pair может связать и большее кол-во структур разного предназначения.. smile
ИМХО! Сам я в си++ не шарю big_smile

70

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

Эх,такое бы в Паскаль smile

71

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

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

72

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

А ну да smile Динамика рулит!

73

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

Да! Но я просто выразил мнение как ещё можно решить её за линейно smile
А какое хоть изменение :%?

74

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

Так а что тут непонятного?
Когда рёбра просто дробные то это ниначто не влияет.
А вот когда рёбра и отрицательные могут быть,то происходит та же проблема что и при пуске дейкстры по графу с отрицательными рёбрами^_^
КАДР а тут динамика не покатит? Вроде динамике то пофигу.

75

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

wink