【SCOI2012】训练总结

  1. SCOI2011第一试

    当天考试得分120分。

    1. 第一题是差分约束系统。期望得分100分,实际得分80分。

      错因:

      1. 没有特殊判断输入数据矛盾的情况,导致超时。

      2. 此题要求求出最小解,而我用的是经典差分约束系统(求最短路的方法),此方法只能求出最大解,所以出错。(正确方法是将所有边都建成正边,然后求一次最长路。)

      3. 没有判断求最长路时存在的负环,所以导致程序死循环。

      总结:

        1. 今后遇到差分约束系统时先要分析清楚到底是求最大解还是最小解,若求最大解则建负求最短路,反之建正边求最长路。

        2. 要充分考虑有环的情况。

    2. 第二题是基于连通性的状态压缩动态规划。期望得分40分,实际得分40分。

      总结:不会做一定要骗分!比如这道题就可以用简单的动态规划过30+特殊数据处理10分。(若还能写出搜索来,则还可以得20分。)

    3. 第三题至今不会,据说是一道数据结构或者线性规划类型的题目。

  2. SCOI2010第一试

    当天考试得分150分。

    1. 第一题是数论题(容斥原理)。期望得分30分,实际得分10分。

      错因:不应该使用01枚举,而应该用DFS+剪枝的形式,可以多过很多组。

      总结:

      1. 不要盲目使用一种算法到底。(比如01枚举行不通时应该果断换为DFS。)

      2. 部分打表要讲究技巧,比如此题可以将表中某些明显不会被枚举到的值删掉。

    2. 第二题是二分图匹配。期望得分100分,实际得分100分。

    3. 第三题是单调队列优化的动态规划。期望得分50~60分,实际得分40分。

        错因&总结:

      1. 不应盲目使用状压DP

      2. 写这类单调队列优化的动态规划时,一定要使用对拍验证。

  3. SCOI2009第一试

    当天考试得分200分。

    1. 第一题是朴素枚举题。期望得分100分,实际得分100分。(之前做过。)

      总结:不可盲目优化,即使要优化,也要使用对拍验证。

    2. 第二题是数论+搜索。期望得分100分,实际得分100分。(之前做过。)

      总结:

      1. 记忆化搜索比直接递推常数更大,所以能不使用记忆化搜索就尽量不使用记忆化搜索。

      2. 应当优化质数表生成器,使得其达到线性复杂度。

      3. 附关键代码:

        top = 0;
        for (int i = 2; i <= n; ++i) //n为枚举范围。
        {
            if (!tag[i]) p[top++] = i;
            for (int j = 0; j < top && p[j] * i <= n; ++j)
            {
                tag[i* p[j]] = 1;
                if (i % p[j] == 0) break;
            }
        }

    3. 第三题是一道动态规划。期望得分20分,实际得分0分。考试时本想直接写出完美算法,但殊不知出了差错连朴素的分都没得到。

      总结:写程序时要想好每一步,防止各种可能的错误,先想好,再仔细地写。

  4. APIO2010

    当天考试得分67分。

    1. 第一题是斜率优化的动态规划。期望得分50分,实际得分30分。

      总结:

      1. 这类问题的决策一般都是单调的,所以使用决策单调性可以降低很大一部分枚举量。

      2. 斜率优化动态规划一定要对拍。

    2. 第二题是树型动态规划。期望得分30分,实际得分37分。

      总结:

      1. K=1的情况很简单,一定要得到这一部分分。

      2. 看到这类问题就要想到树型动态规划,充分思考,想出一个无后效性的状态出来。

    3. 第三题是计算几何。期望得分30分,实际得分0分。

      错因:(未找出。)

      总结:

      1. 计算几何问题都要考虑误差。一些简单的无递归的多次被调用的函数可以使用内联或者宏来实现,节约时间。

      2. 对于极角排序(使用叉乘作为比较函数)等在比较中不具有传递性的排序不能使用sort,而是使用qsort,否则出错。

  5. APIO2009

    当天考试得分110分。

    1. 第一题是动态规划。期望得分无法估计,实际得分46分。

      错因:没有思考清楚反例。

      总结:

      1. 题目中具体到了分成3个正方形很特殊,应注意具体分析。

      2. 对于这类似的某一信息很特殊的动态规划问题,该信息可能为整道题的突破口。

    2. 第二题是倍增思想的应用加平衡树优化,期望得分50分,实际得分0分。

      错因:

      1. 虽然运用了第三题的思路(找最长路),但是没有注意到此题找最长路不能用Dijkstra算法来求解。

      2. 在找最小字典序方案时,没有注意把各个区间按照从小到大的顺序排序,从而造成答案错误。

      总结:

      1. 一定要想办法拿到部分分。

      2. 牢记Dijkstra算法不能用来找含正权图的最长路或者含负权图的最短路。

    3. 第三题是强连通分量加最长路。期望得分84分(Windows环境下)或100分(Linux环境下),实际得分64分。

      错因:

      1. 没有注意到此题找最长路不能用Dijkstra算法来求解。

      2. 重新建图时没有判重,导致超时。

      总结:

      1. 建图时若是稀疏图则考虑判重。

      2. 牢记Dijkstra算法不能用来找含正权图的最长路或者含负权图的最短路

  6. ZJOI2010第一试

    当天考试190分。

    1. 第一题是数字统计问题,期望得分100分,实际得分100分。

      总结:

      1. 这类问题要反复思考,思考周密过后再下结论。

      2. 将复杂问题简单化,分步思考(如这道题先考虑数字1~9的统计最后再考虑0)。

    2. 第二题是最大流加最小费用流,期望得分无法估计,实际得分90分。

      总结:

      1. 遇到不会做的题,一定要大胆思考,从合理性、特殊性等方面思考。

      2. 由于网络流所建的图较复杂,所以先将原来图中到底有哪些边记录下来再重新建图。

    3. 第三题是线段树优化的动态规划,期望得分30分,实际得分0分。

      总结:

      1. 宁愿提交朴素的程序也不要交有错的程序(除非这个有错的程序能够保证相当的正确率)。

      2. 仔细琢磨以下题目,这道题还是没有想象中的那么困难(至少朴素程序可以在一定时间内想出来,甚至是稍加优化的程序)。

  7. PKWC2009第一试

    当天考试200分。

    1. 第一题是朴素的搜索。期望得分100分,实际得分100分。

      总结:

      1. 这类问题不能将其想得过于复杂,否则不仅浪费时间并且有可能出错。

      2. 要注意考虑特殊情况(如这道题中的不同人的视线可以交叉)。

    2. 第二题是状态压缩的搜索。期望得分100分,实际得分60分。

      错因:字典序弄错,如二进制数011011分别对应ABAB,并不是字典序的顺序。

    3. 第三题是状态压缩型动态规划。期望得分无法估计,实际得分40分。

      总结:

      1. 虽然此题题目中说了“100%”的数据满足……但是并不一定代表所有数据的规模都一样大,所以搜索等方法还是值得一试。

      2. 多次计算同一值的情况下可以先预处理减少运算次数。

      3. 散列表中能不用开散列就尽量不用开散列。

  8. ZJOI2009第一试

    当天考试140分。

    1. 第一题是找规律。期望得分无法估计,实际得分100分。

      总结:不会做千万不能放弃,比如这道题规律非常简单,不要被数据规模(n<= 100)所吓倒。

    2. 第二题是二分图匹配。期望得分100分,实际得分0分。

      错因:题目中说到“注意如果第i个人不是在校学生,那么这个位置上的数是一个随机的数,你应该在读入以后忽略它”,我把这个随机数读入之后,没有排除这个信息的干扰,导致全错。

      总结:

      1. 遇到这种含有干扰信息类型的问题应当仔细琢磨,排除一切因干扰信息造

      成的错误。

      1. 自制测试数据一定要考虑全面,若存在性问题则需要考虑存在和不存在两种情况。

    3. 第三题是博弈论。本题未作为考试题目。

    4. 第四题是状态压缩+动态规划+容斥原理,期望得分40分,实际得分40分。

      总结:不能想出完美算法时,能朴素就朴素。


    /****************************************************************\

  1. double类型不能使用%d格式输入或输出,其它类型类似。

  2. 全局变量很危险,不到万不得已千万不得使用。

  3. 动态规划在以下地方容易出错:边界条件,枚举范围,枚举顺序以及结果的取缔范围。

  4. 永远都要记得输样例

  5. 矩阵乘法计算时应确保每一步都取余。

  6. 对实数取绝对值必须使用fabs()而不是abs()

  7. 注意“\”的续行效果,不仅仅是在宏定义的行尾,在单行注释符号”//“的末尾也能起到续行的作用。

  8. abs()函数中不能跟64位整数,如果要用,则应该用std::abs()

  9. 记得检查数组下标越界。

  10. 斜率优化时要注意斜率不存在的情况。

  11. 斜率优化正推不行时可以倒推。

  12. datamaker一定要记得初始化随机数种子srand(time(NULL))

  13. 进考场前先写一个测试随机数的程序(这个很重要),再打框架。

  14. 光是指针符号“*”并不能起到“变参”的作用,需用“*&”符号,也即指针也要传引用。

  15. 注意宏中隐藏的错误(如展开后计算多次)。

  16. 注意isdigit(),isalpha()等函数在使用时一定要加上“string”头文件。(注意不是“cstring”。)

  17. Dev-C++的撤销功能有缺陷,慎用。

  18. 可以采用“局部注释法”,尝试将每个含有关键判断的语句逐个注释掉,看对结果是否有影响。

  19. 在求模次数较多时,用减法较优。但若被除数远远大于除数,用除法较优。

    \****************************************************************/

数据规模

时空复杂度

备注

N <= 10,15, ...

O(N!), O(2N),...

无疑是搜索,要考虑剪枝。

N <= 20,...

-

考虑状压DP

N <= 30,50, ...

O(N4),...

-

N <= 80,100, ...

O(N3),...

-

N <= 500,103, ...

O(N2),...

若是区间DP,则考虑四边形不等式。

N <= 104,105, ...

O(N·log N),...

若是线性DP,则考虑单调队列、斜率优化。

N <= 107,...

O(N), ...

-

N <= 108以上

O(log N), ...

一般是数学问题。考虑矩阵乘法,容斥原理等优化。

你可能感兴趣的:(【SCOI2012】训练总结)