十一期间的考试

· · 个人记录

甜美考试,快乐补题

聪明智慧的 Augury 考了两次第一

Day1 T1 U249249 单峰

题意简述

做法

推式子
因为是个「单峰数列」,所以最大值肯定在中间
那么要考虑的数只有左边和右边,即 n-1
因为「单峰数列」是有序的,所以选数的顺序不重要
容易发现,只要确定了左边的数,右边就可以确定了
而左边有多少选法呢
是时候呼叫「超级卢贞昊」了!!!
那就是 n-1 个数,每个数有左和右两种情况,显然是 2^{n-1} 种情况
所以答案就是 2^{n-1}

注意事项

  1. n\le 10^{18}

    是不是会 \color{052242}\texttt{TLE} 呢?
    是时候呼叫「超级卢贞昊」了!!!
    快!使用!「快速幂」!吼!吼!哈!嘿!

  2. 取余

推荐题目

P1226 【模板】快速幂||取余运算
P1965 [NOIP2013 提高组] 转圈游戏
P3197 [HNOI2008]越狱

Day1 T2 U249250 序列变换

全村人的噩梦
通过 5:100
老师造的数据比原题强哎

题意简述

做法

  1. 既然是一段,那么这堆数就都是一样的
    那么它无论怎么变都是一段,不会被像卢贞昊和某某某一样被分开
    所以用「链表」维护这个数列
    两个相同的数就删掉一个
  2. 把一个数替换成另一个数,反正都是把两种数合并在一起
    那么,把数量少的数替换成数量多的数
    然后,你会发现,你再次操作的时候,他就错了
    所以记录一下每个数被表示成了什么就行了

注意事项

推荐题目

P1996 约瑟夫问题
P1160 队列安排

Day1 T1 [CSP-S2019 江西] 和积和

题意简述

做法

  1. 我们要求和的积的和,不是吗
    那么我们在求和的积中的「和」时,就可以使用「前缀和」维护
    那么就获得了 \Theta(n^2) 的复杂度
    可以得到 70 分的好成绩
  2. 看看这个求和的式子
    对于每一个 l ,式子可以表示为 \sum_{r=l}^n S(l,r)=\sum_{r=l}^n(suma_r-suma_{l-1})\times(sumb_r-sumb_{l-1}) =\sum_{r=l}^n suma_r\cdot sumb_r-suma_r\cdot sumb_{l-1}-sumb_r\cdot suma_{l-1}+suma_{l-1}\cdot sumb_{l-1} =\sum_{r=l}^n suma_r\cdot sumb_r-\sum_{r=l}^n suma_r\cdot sumb_{l-1}-\sum_{r=l}^n sumb_r\cdot suma_{l-1}+\sum_{r=l}^n suma_{l-1}\cdot sumb_{l-1} =\sum_{r=l}^n suma_r\cdot sumb_r-sumb_{l-1}\cdot \sum_{r=l}^n suma_r-suma_{l-1}\cdot\sum_{r=l}^n sumb_r +\sum_{r=l}^n suma_{l-1}\cdot sumb_{l-1}
  3. 然后惊奇地发现,这个式子又是一堆定值的区间和包括:
$$sumsuma_i=\sum_{j=1}^{i}suma_j$$ $b$ 的前缀和的区间和,即 $$sumsumb_i=\sum_{j=1}^{i}sumb_j$$ $a$ 的前缀和乘上 $b$ 的前缀和的区间和,即 $$sumsumasumb_i=\sum_{j=1}^{i}suma_j\cdot sumb_j$$ 4. 所以对于每一个 $l$ 答案就是! $$ans_l=sumsumasumb_n-sumsuma_n\cdot sumsumb_{l-1}$$ $$-sum-sumsumb_n\cdot sumsuma_{l-1}+sumsumasumb_{l-1}$$ 5. 那么最后!总答案就是! $$\sum_{i=1}^nans_i$$ ~~终于写完了啊啊啊~~ ### 注意事项 - 好像聪明的`TQI`在写这道题的时候,取余是对 $10^9+17$ 取的? - 式子挺麻烦的,反正推出来就好办了 - 对前缀和求前缀和,再对前缀和的积求前缀和? 好像很容易写错 ### 推荐题目 [P2280 [HNOI2003]激光炸弹](https://www.luogu.com.cn/problem/P2280) ~~又是一道好题~~ --- ## [Day1 T4 U249263 网格图] 原题[P5687 [CSP-S2019 江西] 网格图](https://www.luogu.com.cn/problem/P5687) ### 题意简述 - 你有一个 $n\times m$ 的网格图 - 行从 $1\sim n$ 编号,列从 $1\sim m$ 编号,每个点可用它所在的行编号 $r$ 与所在的列编号 $c$ 表示为 $(r, c)$。 - 点 $(i,j)$ 与 $(i,j+1)$ 间连有一条权值为 $a_i$ 的边,其中 $1\le i\le n, 1\le j<m$。 - 点 $(i, j)$ 与 $(i+1,j)$ 间连有一条权值为 $b_j$ 的边,其中 $1\le i< n, 1\le j \le m$。 - 求这个网格图的[「最小生成树『`MST`』」](https://oi-wiki.org/graph/mst/) ### 做法 1. 建图,然后跑[「`Kruskal`」](https://oi-wiki.org/graph/mst/#kruskal-%E7%AE%97%E6%B3%95) 能得到 $64$ 分 2. [「`Kruskal`」](https://oi-wiki.org/graph/mst/#kruskal-%E7%AE%97%E6%B3%95)的核心是什么? 对边排序,在不成环的情况下选边权最小的边 然后发现,在这里每条边有一大堆 ~~那么还建个锤子的图~~ 直接对 $a$ 和 $b$ 排序,然后从小到大选边 那么怎么保证不成环呢 你选了一些边,那么要成环就是成「方框」 通过已经选的 $a$ 和 $b$ 中的边的数量就可以算出来要选多少边了 ### 推荐题目 [洛谷题单【图论2-3】最小生成树](https://www.luogu.com.cn/training/209) ## [Day2 T1 P7960 [NOIP2021] 报数](https://www.luogu.com.cn/problem/P7960) ### 题意简述 - 我们将十进制中含有 $7$ 的数称为「不好的数」 - 所有「不好的数」的倍数也是「不好的数」 - 不是「不好的数」的数称为「好的数」 - 给你一个数 $n$ ,如果它是「不好的数」,输出 $-1$ ,否则输出大于 $n$ 的最小的「好的数」 ### 做法 - 对于每一个数 $i$ ,如果 $i$ 是「不好的数」,那么它的倍数也是「不好的数」 - 所以,开一个数组 $vis$ 记录一个数是不是「不好的数」 - 如果 $i$ 是「不好的数」而且 $vis_i=0$ ,把 $i$ 所有的小于 $10^6$ 的倍数的 $vis$ 标成 $1
for(int i=maxx;i>=1;i--){
    if(!vis[i]){
        nxt[i]=nnx;
        nnx=i;
    }
}

推荐题目

P3383 【模板】线性筛素数
P1865 A % B Problem

Day2 T2 P7913 [CSP-S 2021] 廊桥分配

题意简述

做法

注意事项

  1. 廊桥的「借与还」很容易写错,还有就是当 n 个廊桥也不能满足所有的飞机时,就要放下一些飞机,容易写错( TQI 亲身试错)

Day2 T3 P5658 [CSP-S2019] 括号树

快乐的树题
TQI 在考场上推式子推错了,然后得到了 10 分的好成绩

题意简述

本题中合法括号串的定义如下:

  1. () 是合法括号串。
  2. 如果 A 是合法括号串,则 (A) 是合法括号串。
  3. 如果 AB 是合法括号串,则 AB 是合法括号串。

本题中子串不同的子串的定义如下:

  1. 字符串 S 的子串是 S连续的任意个字符组成的字符串。S 的子串可用起始位置 l 与终止位置 r 来表示,记为 S (l, r)1 \leq l \leq r \leq |S ||S | 表示 S 的长度)。
  2. S 的两个子串视作不同当且仅当它们在 S 中的位置不同,即 l 不同或 r 不同。

做法

  1. 如果 s_{i-dp_{i-1}-1}="(" ,那么 dp_i=dp_{i-1}+2
  2. 如果 1 成立,那么定义 j=i-dp_i ,然后将 dp_i 加上 dp_j

推荐题目

P1944 最长括号匹配

Day2 T4 P7075 [CSP-S2020] 儒略日