C++ 转 C 警示后人
查看原帖
C++ 转 C 警示后人
1283988
leozhao123楼主2025/6/21 20:36
  1. 头文件用.h结尾的、删命名空间、用typedef(这个应该不用说了;
  2. 如果你用 vector 存图,那么:
    • vector<int>g[N];改为int g[N][N],gtot[N];
    • 遍历时把for(int v:g[u])for(it v=g[u].bg(); ...)改为for(int i=1;i<=gtot[u];++i) {v=g[u][i]; ...}
    • 加边时把g[u].pb(v)改为g[u][++gtot[u]]=v
  3. 函数不能用默认参数,比如build(int u=1,int l=1,int r=n)不行
  4. 结构体构造函数没试过,但void(w[u]=_w)之类的不能用。

另外,

  • 定义数组的大小不能用 const int,必须用 define,比如
    const int N=10003;
    ll c[N];
    
    应改为
    #defing N 10003
    ll c[N];
    
  • C 语音 scanf 和 printf 输入输出 32 位整数,Win 的格式符是"%I32d",Linux 是"%d",本地调试可以定义
    #ifdef __linux__
    #define fmt "%d"
    #else
    #define fmt "%I32d"
    #endif
    
  • 如果你按照上面的方法存图,要把 long long 改为 int,否则容易炸空间
  • 如果 TLE,小心 min 和 max !!!C 里面定义的是
    #define max(a,b) ((a)>(b)?(a):(b))
    #define min(a,b) ((a)<(b)?(a):(b))
    
    这时如果调用max(query(l,r,...),query(l,r,...))将导致其中一个query被调用两次。
  • 如果 TLE,慎用 memset,看清你的代码里那些数组真的要初始化,那些会被覆盖不用初始化。
  • 然后实在不行,其实 SPOJ 上是不管优化指令集的,所以可以用#pragma GCC optimize("Ofast")开优化。
2025/6/21 20:36
加载中...