1

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

e-maxx добрый

Крайне добрый. Я бы уже давно отправил бы аккаунт автора поста на йух, были бы права. smile)

2

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

Может банить надо?...

3

(18 ответов, оставленных в OlympNews)

А что с интернетом? Будет? Или gprs-ом нужно запасаться smile Какие номера планируются: одно/двух/трех/n-местные? smile Душ и туалет на этаже?

4

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

Элементарные задачи, где всё сводится к самому алгоритму очевидным образом, - не думаю, что стоит кидать много таких задач

Много не стоит, но одну хотя бы добавить можно. Чтобы не получалось, что прочел теорию (например, макс. поток), берешь задачу, а там помимо макс. потока, к которому сейчас есть интерес, требуется написать еще 2-3 алгоритма на другую теорию. smile Если я не прав - поясните почему. smile

Поэтому может создать отдельный подраздел на сайте, и в конец статей добавлять ссылки на эти блоки задач?

Наверно, лучше сделать так. Но это все же виднее тебе, как автору.

5

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

О себе:

  • Gentoo Linux

  • Текстовый редактор с подсветкой синтаксиса Kate (C++) или Eclipse (Java)

  • gcc-4.3.2

6

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

Какое ПО Вы используете для решения задач:

  • ОС

  • Среда разработки

  • Компилятор

7

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

Каким образом можно определить количество различных подстрок для строки длиной до 200 000?

8

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

Думаю, было бы не плохо, если в статьи добавить еще ссылки на задачи, решаемые описанным с статье алгоритмом. Обычно, чтобы запомнить и научиться применять алгоритм в условиях контеста, нужно его "обкатать", т.е. реализовать несколько раз в различных задачах. Насколько я знаю, подобная классификация "тема - номера задач с различных архивов" есть, например, у Владимира Чалышева. Надеюсь, он будет не против поделиться материалами с сообществом. smile

9

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

их выкладывают нам в виде контестов на нашем сервере

В общий доступ?

10

(18 ответов, оставленных в OlympNews)

На сборах я тоже буду присутствовать в качестве помощника Михаила Мирзаянова

Значит увидимся, надеюсь

Кстати, будут и 2 наши команды, но не SU1 и не SU2 (ну я-то буду, но не участником smile )

Кто бы сомневался smile

11

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

Надеюсь, это не с идущих сейчас сборов задача?

Какие сборы ты имеешь в виду? В Минске? Или школьников?

Потому что эти задачи я потом в виде контестов буду прорешивать

Есть ли возможность поделиться материалами? smile

12

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

А чем не устраивает это и вот это?

13

(14 ответов, оставленных в Feedback)

По поводу wiki - присоединяюсь

14

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

Спасибо за совет. Попробую на Java с BigDecimal. О результате отпишусь smile

15

(18 ответов, оставленных в OlympNews)

У нас вторая команда должна поехать в Пермь, если успеем документы оформить. А я планирую один в Саратов зарулить. smile

16

(18 ответов, оставленных в OlympNews)

AlexFetisov
Вы в Пермь или Минск едете?

17

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

Программа удаляет 3 точки лежащие на одной прямой, т.к.:

while( up.size() > 1 && ccw( up[ up.size() - 2 ], up[ up.size() - 1 ], v[ vec[ i ] ] ) )
                up.pop_back(),
                u.pop_back();

и

while( down.size() > 1 && cw( down[ down.size() - 2 ], down[ down.size() - 1 ], v[ vec[ i ] ] ) )
                down.pop_back(),
                d.pop_back();

В то время, как в:

int cw( pt & p1, pt & p2, pt & p3 ) {
    return (
            ( p1.y + p2.y ) * ( p2.x - p1.x ) + 
            ( p2.y + p3.y ) * ( p3.x - p2.x ) +
            ( p1.y + p3.y ) * ( p1.x - p3.x )
            ) >= 0;
}
int ccw( pt & p1, pt & p2, pt & p3 ) {
    return (
            ( p1.y + p2.y ) * ( p2.x - p1.x ) + 
            ( p2.y + p3.y ) * ( p3.x - p2.x ) +
            ( p1.y + p3.y ) * ( p1.x - p3.x )
            ) <= 0;
}

проверяется равенство 0. Или я не совсем верно понял:

Мне показалось, или программа действительно не удалит три точки, лежащие на одной прямой?

По поводу точности - была идея переписать на Java с BigDecimal, но всё же должно же быть решение на С++, которое проходит. smile

18

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

Собственно, условие:

You are given several points on the plain. Find their convex hull.

Input
The first line of the input file contains n - the number of points (3<=n<=200000).
The following n lines describe points. Each point is described by two integer
numbers - its coordinates. Coordinates do not exceed 10^9 by their absolute
values. There three points that are not on the same line. There can be equal points.

Output
The first line of the output file must contain the number of vertices in the
convex hull. The second line must contain numbers of points that are vertices
of the convex hull in its cointercloclwise traversal. No two edges of the hull
must be on the same line.
The third line must contain the length of the perimetr of the hull. The fourth
line must contain the area of the hull. These two numbers must be accurate up to
10^-6

Examples

convex.in

9
0 0
1 1
2 2
1 0
0  1
2 0
0 2
2 1
1 2

convex.out

4
1 6 3 7
8.0
4.0

Привожу здесь же мой код, который в таком виде получает WA 8:

#include<cstdio>
#include<vector>
#include<algorithm>
#include<iostream>
#include<cmath>

using namespace std;

typedef long long ll;
typedef pair<ll,ll> pt;
typedef vector<pt> vpii;

#define x first
#define y second
#define mp make_pair
#define pb push_back

int n;
vpii v;
vector<int> ans;

int cw( pt & p1, pt & p2, pt & p3 ) {
    return (
            ( p1.y + p2.y ) * ( p2.x - p1.x ) + 
            ( p2.y + p3.y ) * ( p3.x - p2.x ) +
            ( p1.y + p3.y ) * ( p1.x - p3.x )
            ) >= 0;
}
int ccw( pt & p1, pt & p2, pt & p3 ) {
    return (
            ( p1.y + p2.y ) * ( p2.x - p1.x ) + 
            ( p2.y + p3.y ) * ( p3.x - p2.x ) +
            ( p1.y + p3.y ) * ( p1.x - p3.x )
            ) <= 0;
}
void out( vpii & v ) {
    for( int i = 0; i < 15; ++i )
        cerr << "-";
    cerr << endl;
    for( int i = 0; i < v.size(); ++i )
        cerr << v[ i ].x << " " << v[ i ].y << endl; 
    for( int i = 0; i < 15; ++i )
            cerr << "-";
        cerr << endl;
} 
int cmp( int a, int b ) {
    return v[ a ] < v[ b ];
}
vpii convex_hull( vpii v ) {
    vector<int> vec;
    for( int i = 0; i < v.size(); ++i )
        vec.pb( i );
    sort( vec.begin(), vec. end(), cmp );
    //out( v );
    pt p1 = v[ vec[ 0 ] ];
    pt p2 = v[ vec[ vec.size() - 1 ] ];
    vpii up, down;
    down.pb( p1 );
    up.pb( p1 );
    vector<int> d, u;
    d.pb( vec[ 0 ] );
    u.pb( vec[ 0 ] );
    for( int i = 1; i < v.size(); ++i ) {
        if( i == v.size() - 1 || cw( p1, v[ vec[ i ] ], p2 ) ) {
            while( up.size() > 1 && ccw( up[ up.size() - 2 ], up[ up.size() - 1 ], v[ vec[ i ] ] ) )
                up.pop_back(),
                u.pop_back();
            up.pb( v[ vec[ i ] ] );
            u.pb( vec[ i ] );
        }
        if( i == v.size() - 1 || ccw( p1, v[ vec[ i ] ], p2 ) ) {
            while( down.size() > 1 && cw( down[ down.size() - 2 ], down[ down.size() - 1 ], v[ vec[ i ] ] ) )
                down.pop_back(),
                d.pop_back();
            down.pb( v[ vec[ i ] ] );
            d.pb( vec[ i ] );
        }
    }
    vpii res;
    for( int i = 0; i < down.size(); ++i )
        res.pb( down[ i ] ),
        ans.pb( d[ i ] );
    for( int i = up.size() - 2; i > 0; --i )
        res.pb( up[ i ] ),
        ans.pb( u[ i ] );
    //out( res );
    return res;
}
double dist( pt & p1, pt & p2 ) {
    return sqrt( ( double )( p1.x - p2.x ) * ( p1.x - p2.x ) +
            ( p1.y - p2.y ) * ( p1.y - p2.y) );
}
ll square( pt & p1, pt & p2 ) {
    return ( p1.y + p2.y ) * ( p2.x - p1.x );
}
int main() {
    freopen( "convex.in", "r", stdin );
    freopen( "convex.out", "w", stdout ); 
    cin >> n;
    v.resize( n );
    for( int i = 0; i < n; ++i )
        cin >> v[ i ].x >> v[ i ].y;
    v = convex_hull( v );
    //out( v );
    cout << v.size() << endl;
    for( int i = 0; i < v.size(); ++i ) 
        cout << ans[ i ] + 1 << " ";
    double per = 0.0;
    ll sq = 0;
    for( int i = 0; i < v.size(); ++i ) {
        int j = ( i + 1 ) % v.size();
        per += dist( v[ i ], v[ j ] );
        sq += square( v[ i ], v[ j ] );
    }
    sq = abs( sq );
    cout.precision( 7 );
    cout << fixed << endl << per << endl;// << -double( sq ) / 2.0 << endl;
    if( sq & 1 )
        cout << sq / 2 << ".500000";
    else cout << sq / 2 << ".000000";
    return 0;
}

Ситуация такая, что в зависимости от изменения значения

cout.precision( 7 );

а также изменения

double dist( pt & p1, pt & p2 ) {
    return sqrt( ( double )( p1.x - p2.x ) * ( p1.x - p2.x ) +
            ( p1.y - p2.y ) * ( p1.y - p2.y) );
}

на

long double dist( pt & p1, pt & p2 ) {
    return sqrt( ( long double )( p1.x - p2.x ) * ( p1.x - p2.x ) +
            ( p1.y - p2.y ) * ( p1.y - p2.y) );
}

происходит варьирование теста, на котором падает мое решение. От 4-го до 8-го. Вполне может быть, что ошибка в реализации функции convex_hull, хотя я её в упор не вижу. smile У кого-нибудь есть идея с какой точностью нужно выводить ответ или как посчитать верный ответ? Или же может у меня ошибка в другом вообще, а я не туда смотрю...

Заранее спасибо за помощь.

19

(18 ответов, оставленных в OlympNews)

Мне кажется, что просто не рассчитывали на такой ажиотаж smile