- OJ评测时不会输出debug信息
- 本地测试时使用
#undef qdd
屏蔽debug信息
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define ALL(x) begin(x), end(x)
#ifdef qdd
#define dbg(x...) do { cerr << #x << " = "; ringo.w(x); cerr << endl; } while (0)
#else
#define dbg(...)
#endif
struct Debug {
template<class T, class... U> void w(T x, U... y) { w(x); cerr << ", "; w(y...); }
template<class T> void w(T x) { cerr << x; }
template<template<class...> class T, class t> void w(T<t> v) {
int f = 1; cerr << '{';
for (auto x : v) { if (!f) cerr << ", "; f = 0; w(x); }
cerr << '}';
}
} ringo;
// -----------------------------------------------------------------------------
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
return 0;
}
快速编译运行
#!/bin/bash
g++ $1.cpp -o $1 -O2 -std=gnu++20 -Wall -Dqdd && ./$1
CMakeLists.txt (for CLion)
add_compile_options(-O2 -std=gnu++20 -Wall -Dqdd)
file(GLOB problems RELATIVE ${CMAKE_CURRENT_LIST_DIR} *.cpp)
foreach(p ${problems})
add_executable(${p} ${p})
endforeach()
CLion Shortcuts
Redo: Ctrl+Shift+Z
Replace: Ctrl+R
Multiple Cursors: Alt+Shift+Click
Move Lines: Ctrl+Shift+Up/Down
Block Comment: Ctrl+Shift+/
Format File: Ctrl+Alt+L
Run: Shift+F10
Debug: Shift+F9
Step Over: F8
Step Into: F7
Step Out: Shift+F8
Re-run: Ctrl+F5
Resume: F9
vimrc
syntax on
set nu
set cindent
set tabstop=2
set shiftwidth=2
set softtabstop=2
set expandtab
set mouse=a
Fib
#include <iostream>
using ull = unsigned long long;
const ull N = 1e6;
// stack test
ull f(ull x) {
static ull F[N] = {1, 1};
return F[x] ? F[x] : F[x] = f(x - 1) + f(x - 2);
}
// speed test
// f(2e9 - 1) = 2697763845588227525
ull f(ull x) {
ull a = 1, b = 1, c = 0;
for (ull i = 2; i <= x; i++) {
c = b;
b = a;
a = b + c;
}
return a;
}
int main() {
std::cout << f(N - 1) << '\n';
return 0;
}
热身赛要测的东西
- 热身赛也要带板子
- 如果现场机器的时间不正确,尝试调整
- 打印
- 提问
- 代码长度限制
- OJ返回值:CE(是否罚时,有没有CE信息), RE, TLE, MLE, PE/OLE
- cerr会不会WA
- Java环境
- Python环境
- 读整行
- 栈大小 -O2
- 输出格式问题(%lld, %Lf, 行末空格和回车)
- 本地机器速度
- 评测机速度
- __int128
- C++11(auto, range-for, lambda)
- pb_ds
您好这边建议您再WA一次呢
读题
- 确认题意 确认题意 确认题意(e.g. 模数? 要求字典序最小/最大? 严格递增/不严格?)
- 读完题之后必须看一遍clarification
想题
- 在纸上写下自己的观察
- 复杂度很奇怪的题($n \log ^ 3 n, n \sqrt n \log n$)可以试一下暴力
- 猜结论的题尽量打表验证
写题
- 难写的题不要急着上机 先在纸上列个框架
- 表示点/坐标不要用x1 y1 写xx yy
- stack queue priority_queue取值前先判空
- 排序时注意结构体的所有属性是不是考虑了
- 想清楚到底是要multiset还是set
- 预处理组合数 2倍上限
- 数据结构注意数组大小(2倍,4倍,logn倍)
- 二分答案估算一下上界 不要直接开1e18
- 树链剖分/dfs 序,初始化或者询问不要忘记dfn
- 确定不能用long long再开double ($\pm 2^{53} (9 \times 10^{15})$) / long double ($\pm 2^{64}$)
- 输入数据1e6以上考虑读入优化
- 空间够开数组 不要用map / set
- 中途出答案也要读完
调题
- 1LL « k
- n m i j 打反 两重 i++
- n m k 等定义成全局变量时注意是否有同名局部变量
- cout « (a ? b : c) « …
- while (!q.empty()) 不要忘记 pop
- 欧拉降幂小心指数变成负数
- 字符串数据集 01, 大 / 小写, 大小写 c-‘0’ c-‘A’ c-‘a’
- 多次运行结果不同 / WA样例:检查一下初始化和数组越界
- TLE先考虑能不能少个log 再考虑常数优化
- 求最优解时不要忘记更新当前最优解
- accumulate(a, a + n, 0) 数组是long long也会返回int
- x ⊕ y 可能大于 max(x, y) (心态崩了)
交题
- 看一遍clarification
- 删除freopen和debug信息
- 看一下数据范围,测一下边界
- 检查一遍初始化 (如果有T Case, 必须有T>=2的样例)
- 看一下有没有无解的情况 如果无解要输出什么
- 构造题看一下是否要先输出ans.size()
- 打印代码