写代码要注意的几点(2)

一。用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];

求最近公共组先,根据两个结点的深度,如不同,向上调整深度大的节点,使两个节点处在同一层上,这时,如果正好是祖先,结束。否则将两个节点同时上移。

~~~模版~~~

原文地址:https://www.cnblogs.com/syx-799/p/5781876.html