- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
#include <bits/stdc++.h>
using namespace std;
#define mp make_pair
#define mt make_tuple
#define pb push_back
#define rep(i,a,b) for(int i=a;i<b;++i)
#define forn(i, n) for(int i=0;i<n;++i)
#define forv(it, v) for(typeof((v).begin()) it = (v).begin(); it != (v).end(); ++it)
#define all(c) (c).begin(), (c).end()
#define fst first
#define snd second
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef pair<int,int> pii;
typedef long long ll;
typedef vector<ll> vll;
typedef pair<ll,ll> pll;
typedef long double ld;
typedef string st;
const int inf = 1000 * 1000 * 1000;
const int mod = 1000 * 1000 * 1000 + 7;
const ld pi = acos(-1.0);
const ll infl = 1000ll * 1000ll * 1000ll * 1000ll * 1000ll * 1000ll;
const ld eps = 1e-7;
#define y1 y1_dhs
В продолжении предыдущего ГК: типичное начало олимпиадной проги на С++.
Bobik 16.11.2015 02:23 # 0
Bobik 16.11.2015 02:31 # +1
#define _ ios_base::sync_with_stdio(0);cin.tie(0);
Abbath 16.11.2015 02:47 # +1
Abbath 16.11.2015 03:01 # +2
TarasB 16.11.2015 11:26 # 0
Разумеется, выражения для вывода типов в обратную сторону должны соответствовать некоторым правилам.
roman-kashitsyn 16.11.2015 11:31 # +4
Например, можно сделать так, что выражения x
let x = 1 + 2 * 3
станет типа AstNode со значением
(Op Plus (Const 1) (Op Mul (Const 2) (Const 3))
kegdan 16.11.2015 13:23 # −3
inkanus-gray 16.11.2015 15:47 # +5
Abbath 16.11.2015 11:53 # 0
TarasB 16.11.2015 14:12 # 0
например:
float x = 1.0; // тут выводится, что float
auto y = x*(2.0+3.0); // тут через ветку x распространяется на прочие ветки, что это float;
При наличии хитрых перегрузок не работает.
Грубо говоря, работает только в ветках, внутри которых все функции монотипны (т.е. все аргументы принимают одного типа и возвращают того же типа).
Abbath 16.11.2015 14:21 # 0
Antervis 16.11.2015 15:24 # 0
Abbath 16.11.2015 15:31 # 0
Antervis 16.11.2015 15:40 # +4
long double operator "" _ld(long double value) {
return value;
}
1.0_ld будет long double.
и функции определять как:
template <typename T>
std::enable_if<std::is_floating_point<T> ::value, T> func(T value) { ... }
Такая функция вернет значение передаваемого в неё аргумента типа с плавающей точкой.
Abbath 16.11.2015 15:43 # +4
Antervis 16.11.2015 16:43 # 0
dxd 16.11.2015 19:36 # +1
Bobik 16.11.2015 20:03 # +3
Правда, некоторые люди в оргкомитетах настолько сильно любят питон, что вымеряют ограничения по времени и памяти по решению на нём.
Antervis 17.11.2015 05:42 # +2
kegdan 17.11.2015 05:56 # 0
>> либо задача будет решаемой на питоне и в то же время решаемой в лоб на си,
А что, си у нас уже не полны по Тьюрингу?
Antervis 17.11.2015 06:11 # +1
Полнота по Тьюрингу не имеет никакого отношения к сабжу
kegdan 17.11.2015 06:19 # 0
Antervis 17.11.2015 06:46 # 0
kegdan 17.11.2015 06:47 # 0
Antervis 17.11.2015 07:03 # +3
(в силу быстродействия)
kegdan 17.11.2015 07:19 # −1
То есть питон не полон по Тьюрингу?
Antervis 17.11.2015 07:23 # +1
kegdan 17.11.2015 07:26 # −1
Antervis 17.11.2015 07:38 # +4
guest 17.11.2015 11:17 # −1
roman-kashitsyn 17.11.2015 11:25 # +4
Типичной гонялке тестов наплевать, что у тебя. Ты сабмитишь только код, он выполняется в заранее оговоренной (версии компиляторов, флажки компилиции и т.п.) изолированной среде.
PyPy поможет тебе разве что в Google Code Jam - там тебе на своей машине тесты надо запускать, а судья принимает только файл с ответами.
Antervis 16.11.2015 05:57 # +4
kegdan 16.11.2015 06:36 # +4
gost 16.11.2015 10:55 # +2
> const ll infl = 1000ll * 1000ll * 1000ll * 1000ll * 1000ll * 1000ll;
Тяжелый случай.
Abbath 16.11.2015 11:51 # +3
kegdan 16.11.2015 13:19 # +3
"дано 2015 х..."
roman-kashitsyn 16.11.2015 15:02 # +1
TarasB 17.11.2015 10:15 # 0
Bobik 17.11.2015 10:17 # +2
TarasB 17.11.2015 11:45 # 0
А я думал, это хак такой, который позволяет решить некоторые задачи без длинной арифметики, с высокой вероятностью.
Bobik 17.11.2015 12:14 # +2
Заменяем LongInt c долгими арифметическими операциями на ModuleInt с относительно быстрыми:
Bobik 17.11.2015 12:15 # +1
bormand 17.11.2015 17:50 # +1
kegdan 17.11.2015 17:59 # 0
Bobik 17.11.2015 18:32 # 0
bormand 17.11.2015 18:08 # 0
Деление тоже прекрасно запиливается. Но не так тривиально.
roman-kashitsyn 17.11.2015 18:35 # 0
Если P простое :) А так да, расширенный алгоритм Евклида.
bormand 17.11.2015 18:37 # +2
Если делитель и P взаимно-простые, емнип. Или я туплю?
roman-kashitsyn 17.11.2015 18:43 # +1
Да нет, всё так. Просто модуль P обычно известно в компайл-тайме, а делитель известен только в рантайме.
К счастью, задачки обычно построены так, что деления не нужно, только сложение и умножение.
bormand 17.11.2015 19:07 # 0
Bobik 17.11.2015 20:35 # 0
guest 17.11.2015 20:36 # 0
и сортировкой пузырьком
bormand 17.11.2015 21:40 # +2
Да можно ещё проще - средним арифметическим джвух int'ов.
Очевидно, что среднее арифметическое двух int'ов влезает в int. Нужно написать функцию, которая его возвращает :)
Bobik 17.11.2015 21:42 # 0
Кстати, мы в школе проходим эту ошибку.
roman-kashitsyn 17.11.2015 23:33 # 0
В 99.9% случаев в бинпоиске все числа неотрицательные и b > a, поэтому можно смело писать a + (b - a) / 2.
Bobik 17.11.2015 23:50 # 0
А если в программе есть массив на миллиард элементов, по которому делается бинпоиск, то, наверно, чинить надо не среднее, а крышу.
bormand 17.11.2015 23:59 # 0
inkanus-gray 17.11.2015 21:45 # 0
bormand 17.11.2015 22:02 # +2
Но под каждую платформу придётся решать её заново...
kegdan 17.11.2015 22:33 # +1
guest 17.11.2015 22:35 # +2
В противном случае разобрать два варианта, и либо вернуть a + (b - a) / 2, либо (a + b) / 2
kegdan 17.11.2015 22:37 # 0
Но я не втупляю в разговор двух господ - мистера Г и мистера Б
guest 17.11.2015 22:59 # +1
Вариант 2: a+b переполняется. Тогда надо вернуть a + (b-a)/2, так как b-a в таком случае не переполняется.
Для проверки на переполняемость можно, например, посмотреть старший бит (a>>1)+(b>>1)+(a&b&1)
Bobik 17.11.2015 23:02 # +1
kegdan 18.11.2015 04:26 # 0
bormand 17.11.2015 22:45 # 0
P.S. А вообще - на всяких собеседованиях специально вопрос задают в размытой форме, чтобы ты спросил "а как вернуть среднее арифметическое 1 и 2". Если спросил - получишь плюсик в карму. Так что всё ок.
kegdan 18.11.2015 04:16 # 0
Abbath 18.11.2015 13:31 # +1
TarasB 18.11.2015 11:31 # 0
Bobik 18.11.2015 11:34 # 0
bormand 18.11.2015 18:28 # 0
Bobik 17.11.2015 18:37 # 0
bormand 17.11.2015 18:40 # 0
> a/b/c % p != a / (bc) % p
Да ну? Пример в студию или слив засчитан (для b, c, bc взаимнопростых с p само собой).
Bobik 17.11.2015 20:14 # +1
Если так, то сливаюсь.
magazovski 16.11.2015 12:50 # +5
У них нет цели писать красивый код. Им надо быстро реализовать алгоритм, часто стандартный но с небольшими отклонениями.
Олимпиадное программирование это как олимпиадная математика - с реальными задачами пересекается редко.
kegdan 16.11.2015 13:19 # +4
так у нас нет цели собирать красивый код. Это говнокод. От слова говно. Секешь?
inkanus-gray 16.11.2015 15:45 # +2
kegdan 16.11.2015 15:51 # +1
ponchic 16.11.2015 21:04 # −2
kegdan 16.11.2015 21:11 # +2
kgm-rj 16.11.2015 21:21 # −3
CHayT 16.11.2015 23:12 # +6
bormand 17.11.2015 17:49 # +2
dxd 18.11.2015 10:44 # +1
roman-kashitsyn 18.11.2015 11:00 # +1
guest 17.11.2015 00:39 # −2
LispGovno 06.06.2016 18:49 # 0
guest 07.06.2016 02:50 # 0
kegdan 07.06.2016 06:32 # 0
3oJloToy_xyeLL 24.08.2021 21:26 # 0