做题常见错误
亿些神奇的错误
警钟敲烂
关于链式前向星
-
用了链式前向星的题的最后几个点TLE/MLE/RE等等非常神奇的错误,一般都是链式前向星数组开小了!
-
有多个图时最好吧
Edge
封装成Graph
结构体struct Graph { struct Edge { int from, to, pre; int w; } es[maxn]; int last[maxn], cnt; inline void addEdge (int u, int v, int w) { es[++cnt] = Edge { u, v, last[u], w }; last[u] = cnt; } inline int from (int i) { return e[i].from; } inline int to (int i) { return e[i].to; } inline int pre (int i) { return e[i].pre; } inline int w (int i) { return e[i].w; } };
-
双向边...
没用的数组别留着
初始化
-
一定要初始化
-
位置不要放错
关于树上信息的统计
一般使用dfs
void dfs (int now)
{
// if (vis[now]) return; // 最好不放在这里
for (int i = last[now]; i ; i = pre[i])
{
int t = to[i];
if (vis[t]) continue;
/* ... 树上信息统计(自上而下) ... */
dfs (t);
/* ... 树上信息统计(自下而上) ... */
}
}
用vis
判断是否是父亲时要把它放在for
循环中int t = to[i];
的后面而不是新的一遍递归的开始
十年OI一场空, 不开long long见祖宗
2023.07.09 22:29 at QBXT SC 有幸见了两次祖宗
改ll要改全!!
upd: 现在已经改成类似jiangly的写法 i64
P2891 Dining
我认为这题必须单独拿出来当典型
同时犯两个有关返回值毒瘤错误调了2天晚上大概6h, 我真的...
-
\(Dinic\)返回值竟然被搞成了\(bool\), 呵呵
-
返回值缩进写错了, 竟然每遍for都要return, 呵呵呵呵呵呵
if / for / while后面不要加分号
这都什么毒瘤错误啊!!!!!
多测?!!
清空
离散化
用vector
离散化的话
正确写法是
inline void descrete () {
vector <int> temp;
for (int i = 1; i <= n; i++) {
temp.push_back (a[i].s);
temp.push_back (a[i].t);
}
sort (temp.begin (), temp.end ());
m = unique (temp.begin (), temp.end ()) - temp.begin();
for (int i = 1; i <= n; i++) {
a[i].s = lower_bound (temp.begin (), temp.begin() + m, a[i].s) - temp.begin() + 1;
a[i].t = lower_bound (temp.begin (), temp.begin() + m, a[i].t) - temp.begin() + 1;
}
}
注意是temp.begin() + m
取模取模取模
pushUp
!!! pushDown
!!!
要用儿子结点的信息的时候必须先 pushDown