ENG  RUSTimus Online Judge
Online Judge
Задачи
Авторы
Соревнования
О системе
Часто задаваемые вопросы
Новости сайта
Форум
Ссылки
Архив задач
Отправить на проверку
Состояние проверки
Руководство
Регистрация
Исправить данные
Рейтинг авторов
Текущее соревнование
Расписание
Прошедшие соревнования
Правила
вернуться в форум

Обсуждение задачи 1306. Медиана последовательности

AC pascal 0.14s solution
Послано esbybb 6 июл 2015 01:42
program ideone;
const TH : integer = 200000; //you can set it less or greater to speed up
INF : Cardinal = 2147483647+2;

var in1, reg, i,j,inx,i1,i2, shift, max, greater:Cardinal;
    n:Cardinal;
    var a :array of Cardinal;

    procedure QSort ( first, last: Cardinal);
   var L, R, c, X: Cardinal;
   begin
      if first < last then
      begin
         X:= a[(first + last) div 2];
         L:= first;
         R:= last;
            while L <= R do
            begin
               while a[L] < X do
                  L:= L + 1;
               while a[R] > X do
                  R:= R - 1;
               if L <= R then
               begin
                  c:= a[L];
                  a[L]:= a[R];
                  a[R]:= c;
                  L:= L + 1;
                  R:= R - 1;
               end;
           end;
        QSort(first, R);
        QSort(L, last);
     end;
end;

begin
    Read(n);

    if (n=1) then
    begin
        Readln(in1);
        writeln(in1);
        halt;
    end;
    shift :=0;
    max := 0;
    if (n>TH) then
    begin
        shift := n-TH;
        n := TH;
    end;
    setLength(a, n+1);

    for i:=1 to n do
    begin
        Read(in1);
        a[i] := in1;
    end;

    Qsort(1,n);
    max := a[n];

    for i:=1 to shift do
    begin
        Read(in1);
        if (in1>max) then
        begin
            a[i] := INF;
            greater := greater + 1;
        end else
        a[i] := in1;
    end;
    Qsort(1,n);

    n := n+shift;
    if (n mod 2=1) then
    begin
        writeln(a[n div 2+1 - shift]);
    end else
    begin
        inx := a[n div 2- (shift)] mod 2;
        inx := inx + a[n div 2 +1- (shift)] mod 2;
        write(a[n div 2- (shift)] div 2  + (a[n div 2 +1 - (shift)] div 2));
        if (inx=1) then
        begin
            write('.5');
        end;
    end;

end.