OI 中的一些优雅(或不优雅)写法

发布时间 2023-10-17 20:37:17作者: cqbzljh

求 max/min

// 当无特殊需求时
inline void Max(int &x, int y) { x = max(x, y); }
inline void Min(int &x, int y) { x = min(x, y); }

// 若有时需要 long long
template<class T> inline void Max(T &x, T y) { x = max(x, y); }
template<class T> inline void Min(T &x, T y) { x = min(x, y); }

// 若需要再同时对它进行更改(不常用,建议不用)
template<class T> inline T &Max(T &x, T y) { return x = max(x, y); }
template<class T> inline T &Min(T &x, T y) { return x = min(x, y); }

// 对多个数求 max/min
max({a, b, ..., c});
min({a, b, ..., c});

对一个数取模时的四则运算(实际只有三则)

// mod 为模数,ll 为 long long 的缩写

// 如果只需要求出该值
inline int ad(int x, int y) { return (x += y) >= mod ? x - mod : x; }
inline int de(int x, int y) { return (x -= y) < 0 ? x + mod : x; }
inline int mu(int x, int y) { return (ll) x * y % mod; }
  
// 如果是将该值加上或减去一个值,则下面方法常数更小,少了一个复制和赋值操作
inline void Ad(int &x, int y) { if ((x += y) >= mod) x -= mod; }
inline void De(int &x, int y) { if ((x -= y) < 0) x += mod; }

// 如果有些题需要对一个数多次求和,则下面方法可以缩减代码长度
template<class ...Args> inline int mu(int x, Args ...args) { return mu(x, mu(args...)); }

枚举一个二进制数的子集

// 设当前状态为 S

...
for (int i = S; i; i = (i - 1) & S) ;
...

递增递减循环语句(个人喜好)

// rep 为 repeate 的缩写,译为重复
#define rep(i, l, r) for (int i = (l); i <= (r); ++i)
// per 为 rep 的倒装写法
#define per(i, l, r) for (int i = (r); i >= (l); --i)