2021.09.11am&pm

--- 预期 实际
A1 100 60
A2 100/0 10
A3 0 0
AS 200/100 70
P1 100 90
P2 100 80
P3 60 0
PS 260 170
S 460/360 240

可能水,一定菜

\(P.S.\) 下午第三题数据严重炸锅,目测是数据都有问题。但内存开小了,理论应该得 \(70pts\)

AM

耶路撒冷战役 \(\blacktriangle\!\blacktriangledown\)

题意

将$ NM \(的方阵拆成\) 11 \(的小块,对于行与行之间的每一条横线,列与列之间,的每一条竖线,都有一个耗费时间的值(可以相同)。拆分后的军队都是独立的,两个独立的部分不能拼接在一起拆分。给出每一条横线和每一条竖线耗费时间的值求\) NM \(的方阵拆成\) 11 $的小块的总消耗时间的最小值。

题解

  1. 每砍一刀,会将一块切成两小块。如此竖着切只会对之后所有横着切的产生要多一刀的贡献。
  2. 换言之,我们如果知道现在竖着砍了 \(k\) 条竖线,就能推出下一次把某条横线砍完需要砍 \(k+1\) 刀。
  3. 状态可以推导,那我们就可以考虑 \(DP\)或者贪心。(这里我选的是\(DP\),考试的时候数组写反挂掉了)
  4. \(DP\)之前我们先要理清两个问题:同样是竖线,先砍哪一个更优?以及,一定每次要把一条线的所有刀都切掉吗?
  5. 通过上面的规律,我们可以发现,越往一条竖线砍断的所需刀数不小于之前的线砍断所需刀数。我们期望总时间最小,那么先要将横线竖线分别降序排序,优先砍靠前的线。
  6. 第二个问题同理,无论与耗时更短还是更长的交换总时间一定变长。
  7. 那么我们很容易得到\(DP\)方程(\(DP[i][j]\) 表示横着砍了 \(i\) 刀,竖着砍了 \(j\) 刀。):

\[DP[i][j]=\min(DP[i-1][j]+a[i]*(j+1),DP[i][j-1]+a[j]*(i+1)) \]

  1. 时间复杂度 \(O(n^2)\),空间复杂度 \(O(n^2)\) ,滚动数组空间复杂度 \(O(n)\)

防线 \(\blacktriangle\!\blacktriangledown\)

题意

在城墙上均匀的部署着 N 个弓箭手,每个弓箭手都拥有各自的身高(可以相同),规定两个弓箭手 A,B 之间可以互相看见当且仅当两个弓箭手相邻或者两个弓箭手之间的弓箭手的身高小于等于 A 和 B 中最矮的人的身高。求能互相看见彼此的弓箭手的对数。

题解

  1. 看到题面就联想到了一道奶牛排队的题。然后就没仔细看题挂掉了
  2. 而内道题的做法就是单调栈
  3. 我们先讨论一下为什么要用单调栈。
    • 通过数据范围(\(n \leq 500000\))与时间(\(0.5s\))能看出,只支持\(O(n)\)\(O(nlogn)\),\(O(n\sqrt n)\)\(O(n\sqrt n)\) 比较难遇到)
    • 这道题的要求是两个弓箭手之间的人都不比他们高,再改下答案定义,求每个弓箭手左侧所有能看到的人数之和,那么一直找左侧比他矮的人,直到第一个比他高的人停止,之间的人数(包括第一个比他高的)便是这个人 \(A\) 的答案。(第一个比他高的人 \(B\) 之前的人因为定义而看不到这个人)。
    • 而左侧也不是所有人都看得到只有当人 \(C\) 满足\(\forall i, B>i>C ,H_C \geq H_i,\)时才能被看到。那左侧的人满足单调不上升才可以,符合单调栈的定义
  4. 但这样是不严格 \(O(n)\) 原因在于,高度相同时,我们不出栈,而要计算答案。这样就会多出很多的操作而 \(TLE\) 。有两种优化方法:二分查找或把开结构体相同高度的计算答案后压成一个值更大的人。

科技树 \(\blacktriangle\!\blacktriangledown\)

题意

高等级的科技都需要保证拥有了相关的低等级科技才能够研究,比如最高级的即最下面一层的需要其左上和右上的科技被研究才能进行研究。每个科技都可以获得不同幅度的价值。科技树第一行有 N 个科技,以后 N-1 行的科技数依次递减,直到第N 行只有一个科技。现在有 M 点科技点,求最大价值。

题解

  1. 这道题考试想太复杂了,都没写出来,其实就是一个记忆化搜索(记忆化搜索在某些情况可以叫做 \(DP\) )
  2. 我们把这 \(N\) 行左对齐,然后竖着切成 \(N\) 条,从右到左依次枚举长度。
  3. 若第 \(i\) 条选择长度为 \(x\) ,那么第 \(i+1\) 条最长选择长度为 \(x+1\) 。通过这个条件就可以简单做出。

PM

求导 \(\blacktriangle\)

题意

\(RT\)

题解

  1. 这道题最难的在得会求导
  2. 模拟。只是注意几点:
    • 当输出指数为\(1\)时不输出 \(^\)
    • 常数项不输出,包括前面符号
    • 符号可能为减号
    • 第一个数不带正号
    • 没有输出时输出\(0\) ( \(10pts\) )

成绩调研 \(\blacktriangle\!\blacktriangledown\!\blacktriangle\)

题面

“班上所有同学的成绩都贴在黑板上。”
石神显得有些心不在焉。最近恍恍惚惚,还请了两天假。
这一次的考试,学生的成绩分为k等,成绩单上按照学生的学号排序。此外,学校要抽一些同学的考
卷去调研,石神将这个任务委派给了你。 抽取的样本有如下要求:
学号连续的学生
得到1等的学生数量在[l_1,r_1]区间内
得到2等的学生数量在[l_2,r_2]区间内

现在请问有多少种抽取样本的方法。

题解

  1. 据说是双指针
  2. 这个数据范围让我蒙了半天。(\(n,k\leq200000\))。我寻思着 \(O(nk)\) 过不了,\(O(n\log k)\),\(O(k\log n)\) 长得又太奇怪,\(O(n)\)\(k\) 没关系,而且数据范围不匹配。(然后真的\(O(n)\))
  3. 联想到单调队列模板题滑动窗口,但和单调队列没关系。
  4. 我们找每个学生作为右端点,找左边最长的符合题意的答案区间。
  5. 那么便可以维护一个计数队列,每进入一个数,对应位置加一,若超过下限,则标记\(need\_to\_fit++\),若超过上限,则立即安排出队操作,直至所有的数都不超过上限。
  6. 计算答案时我们尝试着把左指针往右挪,若仍满足条件则增加答案,不满足就退出,指针回弹。
  7. 时间复杂度最好\(O(n)\)(随机数),最坏\(O(n^2)\)(比如全部学生类型相同,样本范围[1,n])
  8. 那我们要进行优化(这个地方有一点我比较满意,就是我考试的时候一开始只想出了以上最坏\(O(n^2)\) 的算法,并想出了\(HACK\) 数据同时成功优化)
  9. 我们可以同时维护另一个指针,表示左边最短的符合题意的答案区间,再同样维护一个计数数组,在满足题意同时尽可能将左侧元素弹出。答案便是两个指针之间的长度
  10. 时间复杂度 \(O(n)\)

跟踪 \(\blacktriangle\!\blacktriangledown\)

  1. 这道题也是从暴力优化对的(除去数据问题)
  2. 在下只会模拟。
  3. 我们把石神的位置作为根求出两个陌生人的深度,按照规则进行\(dfs\),每次进行换根。时间复杂度 \(O(n^2)\),明显过不掉。
  4. 想的树形\(DP\) 之类的不想写,之后发现并不是。
  5. 我们同样进行假换根,陌生人每次是到度数最小的点,我们还是把石神的初始位置设为 \(1\) ,之后跑路经过的位置值分别设为\(0,-1,-2···\),以此来假换根。时间复杂度 \(O(n)\) (即使是好多个菊花拼一起,复杂度也是\(O(\sqrt n*\sqrt n)=O(n)\)

image
\(\cal {Made} \ {by} \ {YuGe}\)

posted @ 2021-09-13 19:49  u2003  阅读(57)  评论(0)    收藏  举报