antonkasko's blog

By antonkasko, history, 2 years ago, In Russian

Все мы хотим писать код быстрее и проще, особенно на соревнованиях, когда от времени отправки решения зависит место в таблице. Я собрал небольшой шаблон для соревнований по спортивному программированию.

Шаблон

Что тут есть?

Ввод/вывод

Несколько строк которые обычно всегда ускоряют ввод/вывод (cout.tie(0) ничего не делает):

ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);

С помощью этих строк, можно выводить и считывать вектора и пары, с помощью стандартных операторов:

template<typename T>istream& operator >>(istream& in, vector<T>& a) { range(i, a.size()) in >> a[i]; return in; }
template<typename T>ostream& operator <<(ostream& out, const vector<T>& a) { range(i, a.size()) out << a[i] << ' '; return out; }

template<typename T1, typename T2>istream& operator >>(istream& in, pair<T1, T2>& p) { in >> p.first >> p.second; return in; }
template<typename T1, typename T2>ostream& operator <<(ostream& out, const pair<T1, T2>& p) { out << p.first << ' ' << p.second; return out; }

Теперь можно просто делать вот так (Напомню вместо int можно использовать что угодно):

vector<int> a(n);
cin >> a;
cout << a;
pair<int,int> p;
cin >> p;
cout << p;

Дефайны

Один из самых полезных дефайнов:

#define all(x) x.begin(),x.end()

Теперь можно использовать:

sort(all(x))

Вместо

sort(x.begin(),x.end())

Дефайн специально для раундов КФ, умеет запускать несколько тестов:

#define CF(x) int x;cin >> x;while(x--)

Теперь можно делать так:

CF(___) {
 //код
}

Немного упрощений для циклов:

#define range(i,n) for (int i=0;i<n;++i)
#define range(i, s, f) for (int i=(s);i<int(f);++i)
#define rrange(i,n) for (int i=n-1;i>=0;--i)

Этот дефайн ускорит ваш код, если вы часто используете модули. mod — глобальная переменная.

#define md(x) if (x>=mod) x%=mod
  • Vote: I like it
  • -7
  • Vote: I do not like it