26

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

P.S. буду очень благодарен тому, кто нормально сформулирует условие 250 DIV2.

27

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

250 DIV2

Линк задачи :
http://www.topcoder.com/stat?c=problem_ … p;rd=13903

Решение

class MountainRoad{
public :
  double findDistance(vector <int> a, vector <int> b){
    double s = *max_element(b.begin(),b.end()) - *min_element(a.begin(),a.end());
    s *= sqrt(2.0);
    return s;
  }
};

Проходит систем тест.
Люди, почему? : )

500 DIV 2

Линк :
http://www.topcoder.com/stat?c=problem_ … p;rd=13903

Решение реккурентное

if (x % 2 == 0) k = ((x + 1)/2)^2
else k = (x/2)^2
f(x) = f(x/2) + k

hokage объяснил
A couple of observations:
1. When x is odd, f(x) = x. (Since x times 1 = x)
2. When x is even, the greatest odd divisor of x is the number formed by truncating trailing 0's in the binary representation of x.
For instance, if x = 12(1100), f(x) = 3(11); if x = 20(10100), f(x) = 5(101).
This is because every even number can be written as product of an odd number and a power of 2(2, 4, 8,...)
3. 1 + 3 + 5 + ... + (2n - 1) = n^2

Однако, непонятно как мы находим k, и почему алгоритм правильный..

Помогите плз разобраться : )

28

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

Люди, посоветуйте, куда идти после 11 класса -- на мехмат мгу или на вмк мгу?
Вопрос наболевший, никто осмысленного на него ответить не может..мб вы сможете? : )

29

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

"кнута-морриса-пратта"* : )

30

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

Ну лично для меня олимпиадное программирование -- это только ради диплома на всеросе и радости от придуманного алгоритма : ) Вообще, я, видимо, после всероса 2010 вообще забью на такого рода проганье, ибо уже задолбало нереалне имхо % )
Кстати, как считаете, вот с таким подходом к жизни, куда стоит идти -- на ВМК МГУ или на МехМат МГУ?
И да, а кто откуда?( я имею в виду универы и факультеты  : ) )

31

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

2rf пишет:
manof пишет:

4. Граф является деревом если E/2 == V - 1, где E - кол-во ребер, V - кол-во вершин.

Вообще-то просто E = V - 1;



На самом деле это не совсем верно : )

Пример :
4 3 -- 4 вершины, 3 ребра
1 2 -- ребро из 1й вершины во 2ю
2 3
3 1

В рез-те ваш "алгоритм" скажет, что данный граф -- дерево, что вопиющий гон : )
Граф должен еще не иметь циклов : )

32

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

Хм, я думаю, что все-таки составители анкеты знают про треугольник Паскаля, и, если бы хотели узнать про него, так бы и написали "Треугольник Паскаля", а не стали бы вводить в заблуждения народ : )
товарищ 2rf прав -- этот пункт действительно был неким "детектором", проверял народ на вши : )
P.S. Некоторые попались :D, однако все равно поехали в ЛКШ..

33

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

кстати, можно в куче хранить не элементы, а индексы, ну и, разумеется, переопределить operator < на сравнение элементов в массиве d.

34

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

кстати, если не лень, то
http://e-maxx.ru/forum/viewtopic.php?id=30

35

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

нет, эти задачки везде были)
Ну, я, например, московская. И писал московскую, собственно)

36

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

e-maxx
Да-да!:)))
Ну в конце концов можно писать RMQ, что, собственно, я и советую всем пишущим на паскале.
Когда, например, меня добъют сишные строки, я открываю делфи и, если нужно быстро искать минимум-максимум, пишу RMQ. Это просто и удобно:)

Кстати, умею находить минимум/максимум на отрезке [l; r] с помощью RMQ в 5 строчек)
Кто короче?:)

37

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

2009го года)

38

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

областная олипиады по информатике)
первый тур)

39

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

черт, там человек на паскале просил)

40

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

не существует)
а задачка с области), тока там вроде 1500 было.

41

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

to Alexey
Да, запросы только на средний элемент. Нет, последовательность не обнавляется.

to e-maxx
Эм, давайте я дам пример для пояснения:

Последовательность :
i = 0 1 2 3 4 5 6 -- индекс.
     1 4 5 8 3 7 0

Например, на текущем шаге нам нужно найти средний элемент на отрезке [1; 3].
Этот элемент будет 4.
Почему? Отстортим подмассив (4, 5, 8, 3) и получим (3, 4 , 5 ,8) соответственно.
Теперь найдем этот элемент -- его индекс (n - 1) / 2. n в даном случае = 5 => i = 2, т.е. 4.
Вот.

42

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

Хм, и действительно.
Спасибо, попробую так писать smile.

43

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

Люди!
Подскажите, как можно решить следующую проблему:

Дана последовательность целых чисел.
Поступаю запросы на нахождения среднего элемента а отрезке [l; r].
Средним элементом в последовательности 0..n - 1 называют такой элемент, который имеет позицию (n - 1) / 2 в данной упорядоченной последовательности.

Как можно быстро находить такие элементы?
Заранее спасибо!

44

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

если интересно, то вот моя реализация Дейкстры, используя кучу STL.

#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>

using namespace std;

const int inf = 1000;

struct ind
{
    int i, num;
};

bool operator < (const ind &a, const ind &b)
{
    return a.num < b.num;
}

int e[101][101];
int n, s, f;
priority_queue < ind> d1;
bool g[101];
vector < int > d(101);

//ifstream cin("input.txt");
//ofstream cout("output.txt");

void dijkstra(int s1, int s2)
{
    int i, j, bj, bd;
    g[s1] = true;
    for (i = 1; i <= n; i++){
        d[i] = e[s1][i];
        ind f;
        f.i = i;
        f.num = -e[s1][i];
        d1.push(f);
    }
    for (i = 1; i < n; i++)
    {
        bj = -1;
        bd = inf;
        ind f;
        f = d1.top();
        /*bool gg = d1.empty();
        if (g[f.i]){
            while (g[f.i] && d1.empty() == false)
            {
                d1.pop();
                f = d1.top();
            }
        }*/
        d1.pop();
        if (d1.empty()) break;
        bj = f.i;
        bd = -f.num;
        if (bj == -1) break;
        g[bj] = true;
        for (j = 1; j <= n; j++)
            if (bd + e[bj][j] < d[j])
            {
                d[j] = bd + e[bj][j];
                f.i = j;
                f.num = -d[j];
                d1.push(f);
            }
    }
    if (d[s2] == inf) cout << "-1";
    else cout << d[s2];    
}


int main()
{
    cin >> n >> s >> f;
    int i, j;
    if (s == f){
        cout << "0";
        return 0;
    }
    for (i = 1; i <= n; i++)
        for (j = 1; j <= n; j++){
            int k;
            cin >> k;
            if (k == -1 || i == j) e[i][j] = inf;
            else e[i][j] = k;
        }
    for (i = 1; i <= n; i++)
        d[i] = inf;
    dijkstra(s, f);
    return 0;
}