1

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

ИМНО, проще находить отражение так: пусть исходная точка (x0,y0), новая (x1,y1). Тогда
a*x1+b*y1=-a*x0-b*y0-2*c, 
-b*x1+a*y1=-b*x0+a*y0.
Решаешь эту систему, получаешь ответ.

2

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

Замени в функции Normal return

Line(p,p-norm);

на     

return Line(p,p+norm);

Также лучше удалить строки

    if ((p-p1).scal(norm) < 0) norm.x*=-1,norm.y*=-1;    

    norm.makeLen(Line(p1,p2).dist(p));

, потому что так будет меньше погрешность.

3

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

Строим 2 прямых, которые перпендикулярны сторонам и проходят через противоволожные стороне точкам

И находим пересечение этих прямых.

Там же точка пересечения медиан. http://ru.wikipedia.org/wiki/Медиана_треугольника

4

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

http://acm.timus.ru/problem.aspx?space=1&num=1695

Добрый день! Кто-нибудь знает быстрый алгоритм для решения этой задачи? Сам я ее недавно решил, теперь хотелось бы улучшить результат.

5

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

Я знаю, просто предупредил на всякий случай smile

6

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

Когда то писал эту задачу, код сохранился. По моему, он решает не на минимум, а на максимум, но за O(N^3)

#include <cstdio>
#include <cstring>

const int MAX=701;
int a[MAX][MAX];
int n;
int x[MAX], y[MAX], sx[MAX], sy[MAX], mx[MAX], my[MAX];

inline int get(int x,int y)
{
        return a[x][y]-mx[x]-my[y];
}

bool go(int cur)
{
        sx[cur]=1;
        for(int i=0;i<n;i++)
        {
                if(get(cur,i)==0)
                {
                        if(y[i]==-1)
                        {
                                sy[i]=cur;
                                while(1)
                                {
                                        int t=x[cur];
                                        x[cur]=i;
                                        y[i]=cur;
                                        if(~t)
                                        {
                                                cur=sy[t];
                                                i=t;
                                        }
                                        else break;
                                }
                                return true;
                        }
                }
        }
        for(int i=0;i<n;i++)
        {
                if(get(cur,i)==0)
                {
                        if(!sx[y[i]])
                        {
                                sy[i]=cur;
                                if(go(y[i]))
                                {
                                        return true;
                                }
                        }
                }
        }
        return false;
}

int main()
{
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
                mx[i]=-50000;
                for(int j=0;j<n;j++)
                {
                        scanf("%d",&a[i][j]);
                        if(a[i][j]>mx[i])mx[i]=a[i][j];
                }
        }
        for(int i=0;i<n;i++)
        {
                int m=-50000;
                for(int j=0;j<n;j++)
                {
                        int t=get(j,i);
                        if(t>m)m=t;
                }
                my[i]=m;
        }
        memset(x,-1,sizeof x);
        memset(y,-1,sizeof y);
        for(int sc=0;sc<n;sc++)
        {
                memset(sx,0,sizeof sx);
                memset(sy,-1,sizeof sy);
                bool b=go(sc);
                while(!b)
                {
                        int m=-50000, dx;
                        for(int i=0;i<n;i++)
                        {
                                if(sx[i])
                                {
                                        for(int j=0;j<n;j++)
                                        {
                                                if(!(~sy[j]))
                                                {
                                                        int t=get(i,j);
                                                        if(m<t)
                                                        {
                                                                m=t;
                                                                dx=i;
                                                        }
                                                }
                                        }
                                }
                        }
                        for(int i=0;i<n;i++)
                        {
                                if(sx[i])mx[i]+=m;
                                if(~sy[i])my[i]-=m;
                        }
                        b=go(dx);
                }
        }
        for(int i=0;i<n;i++)
        {
                printf("%d ",x[i]+1);
        }
}

7

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

Oleg пишет:

Кстати доминошную динамику можно реализовать и за O(M*N*M^2)

А как?

8

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

shtserg пишет:

Мне рассказывали сдавшие её тогда люди, что в качестве ответа подходит что то вроде (t,t^2,t^3,t^4) для различных t. И что это всё следует из какой-то глубокой теории, которая им была известна. Сомневаюсь, что кто-то решал эту задачу так, как предлагалось на разборе

Да, тоже верное решение. Это следует из того, что определитель Вандермонда никогда не равен нулю. В принципе, если догадаться, что никакие 5 точек не должны лежать в одном 3-х мерном пространстве, то такое решение становится почти очевидным. а насчет сферы- по моему можно обойтись без проверки, ведь вероятность, что из случайно сгенерированных 10 точек какие либо 5 лежат в одном пространстве крайне мала.

9

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

мы знаем, что 5 ребер не могут быть линейно независимые в 4-х мерном пр-ве => одно какое-то может быть представлено через другие 4. Тогда одно из ребер будет находиться внутри фигуры, и не являться необходимым для построения фигуры

Неверно. Из линейной независимости не следует что ребро обязательно лежит внутри. И вообще, следуя этим рассуждениям, можно получить, что в 3-мерном пространстве существуют только 4-вершинные выпуклые многогранники smile

10

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

Если я правильно понял задачу, то по моему достаточно взять n точек на 4-мерной сфере, если n>4, а иначе вывести "нет решения"