Codeforces Round 891 (Div. 3) 总结

发布时间 2023-08-09 01:59:26作者: potential-star

一段时间没打比赛,整个节奏没找到,对于会的问题代码实现的不够顺畅,对于看起来不会的问题总是有种先入为主的算法恐惧,其实不是算法不会,而是思维和灵性不够

  1. c题是构造题,不难想到最小值出现次数一定是最多的,最小值具有的性质是相对位置不影响出现次数,对出现次数排序让整个问题清晰,想到这点整个问题便可以实现。
  • 但这题非常坑的点题面说了构造的数组需要在-1e9到1e9之间,对于最后段可以随意构造的数组要注意只能构造成已经给出的数中的最大值,而不是最大值+1,不然很容易造数据hack,使你构造的数组中出现1e9+1
  1. 没出d是最值得反思的,只是一个简单的不等式代数移项就可以让整个题目豁然开朗,却因为对于题目背景描述而直接放弃。
  2. 赛后目前补了e和f,e题只有排序后才能让问题变得清晰,将数学推导式整体写出来再合并就可以发现只需要用前缀和就可以维护,这告诉我们看问题不能点到点的去看,一段一段的去看会有惊喜
  3. f题的韦达定理很显然,核心在于对于解的所有情况的讨论和一元二次方程精度问题(普遍说sqrt精度很差)。对于sqrt可以直接自己写二分或用sqrtl?

学到的知识点:

  • map的遍历
 // 方式一、迭代器
    for (auto it = mp.begin(); it != mp.end(); it++) {
        cout << it -> first << " " << it -> second << endl;
    }

    // 方式二、range for C++ 11版本及以上
   
    for (auto it : mp) {
        cout << it.first << " " << it.second << endl;
    }

    // 方法三、 C++ 17版本及以上
   
    for (auto [key, val] : mp) {
        cout << key  << " " << val << endl;
    }
  • pair的默认排序是是先对第一个关键字从小到大排序,如果第一关键字相同,在对第二关键字从小到大排序,都是升序。
    但如果自定义cmp函数且函数内部只对first说明排序规则,则第二关键字会以内存空间顺序排列,这点很坑,所以不要犯懒要在cmp函数内部对second进行说明。

  • 对于一定是整数解或者只需要整数解的一元二次方程求解,我们只需要在用过判断判别式是不是完全平方数。如果不是则直接淘汰。