注意!!!!!!!!!

jiazhaopeng

2019-08-06 14:48:46

Personal

总结

2020.3.3 分清N和NN啊!!!!!怎么就是改不掉啊!!!!!!!

2020.3.19 +1

2020.10.5 +1

1.测试数据长什么样都可能。

如果没说没有重边自环,一定要自己判断!!!

2.题目给的是什么、问的是什么一定要搞清楚!写read/printf时问一下:x是编号还是颜色还是i号的权值?给的边的信息是 x,y,z 不一定就是 x \to y 边权为 z,可能是 y \to z 边权为 x,甚至可能是 y \to x,边权为 z

如果写题(尤其是调题时)脑子不清醒或有些急躁时,最好出去洗把脸转一转在回来。不然可能会越写越乱,还影响心情。

比如printf("%.2llf",d)以及typedef long long uint 之类的东西在Win环境下不会报错,而在linux环境下会CE!!!

linux 的使用: Linux

具体易错点:

POJ上CE:

  1. 换掉万能头
  2. 检查有没有把一个long long当成int传进函数里
  3. 把POJ上的语言改成G++
  4. 如果dev都过不去,显示 invalid types 'int[int]' for array subscript,那说明把一个int当成int[]来用了,检查一下有没有重名。

POJ上RE:

  1. 把POJ上的语言改成C++或多试几种语言,检查有没有把一个long long当成int传进函数里
  2. 直接把数组开大10倍(或能开大几倍就开大几倍),以防止N,NN分不清
  3. 检查是否可能会“sqrt(-xxx)”
  4. 检查是否可能会“xxx/0”
  5. 检查是否可能会“h[-5]”
  6. 检查是否可能会“h[1047483647]”(因为死循环或传错变量等)
  7. 与标程对拍或将自己的程序嵌入标程中提交
  8. 放弃该题或重构代码

OJ上MLE:

  1. 适当调整数组大小(调大或调小)
  2. 检查是否陷入死循环
  3. 优化算法

OJ或考试上WA:

  1. 数据小的话可以手玩数据
  2. 如果大数据WA的话,试试开大数组
  3. (尤其是莫名出负数时) defind int long long
  4. uva上由于格式限制比较严格(比如行末不能有多余空行,文件末尾空行也参与比较),可能会容易出格式错误。
  1. typedef long long uint;
  2. printf("%.3llf\n", ans);
  3. define int long long 然后 typedef unsigned int uint;

附:

char a[N],b[N];

strcmp(a,b);

        //if(a>b)return 正数;
        //if(a==b)return 0;
            //if(a<b)return 负数;

注:必要时可以用STL string。

updated on 2019.11.28 分清N和NN!犯了三遍了!

updated on 2020.1.17 连双向边时数组要开大2倍!

DP时要注意更新顺序,有时需要倒着更新。

是否能覆盖全部状态?(正确性)

求解后面状态时是否保证前面状态已经确定?(无后效性)

是否修改了已经确定的状态?(有没有写挂)

if (dep[top[x]] < dep[top[y]])  swap(x, y);

不要:

if (dep[x] < dep[y])    swap(x, y);

2020.4.15: +1

2020.4.29: +1

  1. 用写的快读(read)时要注意:此时已经把数后面的一个字符给输进来了,用getchar()时不要用错

  2. 输入单个字符的正确方式:

char ch[5];
scanf("%s", ch);
ch[0]...;

不到万不得已不要用getchar();

一般的解决办法是:判断若两个都是0x3f,就不让他们俩加或乘了,直接赋值0x3f。

int main() {
    register int bb, cc, la, lb, lc, labc, ans;
    while (q--) {
        read(aa); read(bb); read(cc);
        la = lca(bb, cc);
        lb = lca(aa, cc);
        lc = lca(aa, bb);
        labc = la ^ lb ^ lc;
        ...
    }
    return 0;
}
-Wl,--stack=67108864(win)
ulimit -s 131072(linux)

其中 67108864 = 64 * 1024 * 1024(64MB),131072=128 \times 1024(128MB)

inline ull Rand() {
    ull v = rand();
    v = v << 16 ^ rand();
    v = v << 16 ^ rand();
    v = v << 16 ^ rand();
    return v;
}

如果直接用乘法(rand() * rand() * rand() * rand())的话,有很大概率会随机出 0(Win期望随机出 \frac{4}{65536}0;linux期望随机出 \frac{4}{4294967296}0

(以下为退役以后添加的)

inline int get_lst(int u, int v) {//u is v's ancient
    int lst = -1;
    while (top[v] != top[u]) lst = top[v], v = fa[top[v]];//Attention: `lst = top[v]`, not `lst = v`!
    return v == u ? lst : dedfn[dfn[u] + 1];
}

小Bug

都是一些容易看出来的小错,希望比赛的时候不要降智,留着这种错到最后还看不出来。