$namespace$
还记得列队和天天爱跑步吗?记得当时写部分分写的非常艰难,一大原因就是部分分之间有很多重名的数组,而且大小还不一样大,经常写着写着就串了,而且$maxn$有一次提交时用错了直接全部$MLE$.
虽然正解一般没有这么麻烦,可是考场上不一定能想到正解.根据往年经验,$NOIP$的部分分是非常丰富的,比如列队那题:用四个部分分的程序拼凑就可以得到$80$分的好成绩,而且比满分做法好想不少.天天爱跑步也有五个部分分,相对来说好写的也有$60$分.这才是考试的正确策略嘛...
还有的题需要缩点后重新建图,或者是建一张反图,以前我喜欢这样:
void add1 (int x,int y)
{
g[++h].too=y;
g[h].nex=firs[x];
firs[x]=h;
}
void add2 (int x,int y)
{
G[++H].too=y;
G[H].nex=Firs[x];
Firs[x]=H;
}
然而仅仅依靠大小写区分实在是太困难了,一不注意就会写错,还非常难发现。
直到有一天烜神仙告诉我可以开多个$namespace$...
真的很好用啊,而且一点都不难学.
一个简易版的教程:首先把$using$ $namespace$ $std$去掉,然后全面使用$cin$,$cout$,系统自带的$min$,$max$,此时这些语句前面就必须使用$std::$,等用习惯了换上自己的$namespace$就好了.
这个教程清晰易懂:http://www.runoob.com/cplusplus/cpp-namespaces.html
重载运算符
手写堆是不可能手写堆的,这辈子也不可能手写堆的.
但是...如果要把结构体放进堆里呢?以前一直凑合,比如说堆优化最短路时就用$pair$,毕竟这个是自动按照第一维排序的,但是复杂一些的结构就不能再这么凑合了.决定学一下重载运算符.
这个一定要小心,有时候在自己的电脑上过了,交上去却$CE$,一个相对来说比较稳妥的方式就是“凡是模板上写的,一字不差的抄下来;凡是教程上说的,一字不漏的背下来”.
struct z
{
int v;
bool operator > (const z &a) const {
return v>a.v;
}
bool operator < (const z &a) const {
return v<a.v;
}
};
考试之前一定再看看,不过能不用尽量不用,毕竟不是太熟练.
---shzr