一。用scanf语句读入数据时,%d和%c不要忘记&。读字符串时则不加&;
二。在要读入字符或字符串时要确保没有空字符;尤其是行末回车符和空格;
三。要用半角输入法。全角状态下编译通不过。上次无意间打了一个全角空格,怎么都编译不过去,而且看不出来。无奈只好重新写一遍。
四。循环嵌套时不要起相同的变量名。
五。声明变量时尽量声明的有意义,比如对应英文单词的缩写或汉语拼音的缩写。
六。有的单词不能被声明成变量名称。关键字是C++预定义的一些单词,我们定义变量常量时是不能使用的,列一下吧:auto bool break case catch char class const const_case continue default delete do double dynamic_cast else enum explicit extern false float for friend goto if inline int long mutable namespace new operate private protected public register reinterpret_cast return short signed sizeof static static_cast struct switch template this throw true try typedef typeid typename union unsigned using virtual void volatile while。
七。搜索时要注意回溯。例如迷宫问题,向各个方向探索,没有路,就退一步,继续搜索其他路。
八。根据数据范围选择合适的算法。
九。最近公共祖先LCA倍增算法,时间复杂度nlogn.
预处理通过dfs遍历记录每个节点到根节点的距离dis[i]和深度d[i]。
init()求出每个节点u的2^j祖先p[u][j];
求最近公共组先,根据两个结点的深度,如不同,向上调整深度大的节点,使两个节点处在同一层上,这时,如果正好是祖先,结束。否则将两个节点同时上移。