【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. 错因&总结:

      2. 不应盲目使用状压DP

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

  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. /****************************************************************\

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

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

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

  5. 永远都要记得输样例

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

数据规模

时空复杂度

备注

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), ...

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

中描述了一个幼儿园里分配糖果的问题,每个小朋友都有自己的要求。问题的输入包括两个整数NN和KK,表示幼儿园里的小朋友数量和要满足的要求数量。接下来的KK行表示小朋友们的要求,每行有三个数字,XX,AA,BB。如果X=1,表示第AA个小朋友分到的糖果必须和第BB个小朋友分到的糖果一样多;如果X=2,表示第AA个小朋友分到的糖果必须少于第BB个小朋友分到的糖果;如果X=3,表示第AA个小朋友分到的糖果必须不少于第BB个小朋友分到的糖果;如果X=4,表示第AA个小朋友分到的糖果必须多于第BB个小朋友分到的糖果;如果X=5,表示第AA个小朋友分到的糖果必须不多于第BB个小朋友分到的糖果。这个问题可以被看作是一个差分约束系统的问题。 具体地说,可以使用差分约束系统来解决这个问题。差分约束系统是一种通过给变量之间的关系添加约束来求解最优解的方法。对于这个问题,我们需要根据小朋友们的要求建立约束条件,并通过解决这个约束系统来得出最小的糖果数量。 在问题的输入中,X的取值范围为1到5,分别对应不同的关系约束。根据这些约束,我们可以构建一个差分约束图。图中的节点表示小朋友,边表示糖果数量的关系。根据不同的X值,我们可以添加相应的边和权重。然后,我们可以使用SPFA算法(Shortest Path Faster Algorithm)来求解这个差分约束系统,找到满足所有约束的最小糖果数量。 需要注意的是,在读取输入时需要判断X和Y是否合法,即是否满足X≠Y。如果X=Y,则直接输出-1,因为这种情况下无法满足约束条件。 综上所述,为了满足每个小朋友的要求,并且满足所有的约束条件,我们可以使用差分约束系统和SPFA算法来求解这个问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [【差分约束系统】【SCOI2011】糖果 candy](https://blog.csdn.net/jiangzh7/article/details/8872699)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [P3275 [SCOI2011]糖果(差分约束板子)](https://blog.csdn.net/qq_40619297/article/details/88678605)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值