记CACC 2025区域赛
目录
- [记CACC 2025区域赛](#记CACC 2025区域赛)
题目回忆
A. 狗屎的A+B Problem
\(10^{200}\)数量级的A+B Problem。
狗屎题目。这种极大影响语言平衡的题目不该出现在算法竞赛中。我用蟒蛇写的。蟒蛇注意用整除。
B. 二维DP模板题
给定\(m,n\in\mathbb{N}^*,\ a\in\mathbb{N}^{m\times n}\),从左下角(\((m,1)\))出发,只能向右或向上走,一直走到右上角(\((1,n)\)),求路径上的数的和的最大值。
C. 我是卡常大神
给定\(m,n\in\mathbb{N}^*\),在平面区域\((\mathbb{N}\cap[0,m])\times(\mathbb{N}\cap[0,n])\)上有\(tot\in\mathbb{N}\)个钉子,坐标分别是\(\{(x_i,y_i)\}_{i=0}^{tot-1}\)。你可以加若干个钉子,每加一个的代价都是\(cost\in\mathbb{N}\)。现在你需要划定恰好一个矩形区域,要求其两对对边分别与两个坐标轴平行或重合,且内部没有钉子,但边界上可以有。定义这个矩形区域的价值为其面积。求你的最大净利润(可能为负),即矩形的面积减去加钉子需要的代价。
数据范围:对所有数据,有\(m,n\leq10^9\)。
Subtask \(tot\)规模 特殊性质 分值 1 \(tot\leq500\) \(cost=0\) \(25\) 2 \(tot\leq5000\) \(cost=0\) \(25\) 3 \(tot\leq500\) 存在某些最优解最多需要自己加\(3\)个钉子 \(25\) 4 \(tot\leq5000\) 存在某些最优解最多需要自己加\(3\)个钉子 \(25\) 每个子任务必须全部通过才能得分。
考虑前两个子任务,因为加钉子没有代价,所以只需求出满足条件的最大矩形面积即可。我的思路很暴力,把所有点按一个方向排序,枚举矩形的一对邻边分别在的直线(不妨取更靠近坐标轴的那两条),再枚举其中一条边的对边所在直线(不妨设就是与\(y\)轴平行的那条),按一定方向(根据我们之前取的方式,这里应该是\(+x\)方向)依次枚举的时候就可以获得路径上剩下那条边的\(y\)坐标最大值,这样就能得到面积最大值。中间可以用二分查找优化。但是因为地图很大,所以只能用离散的方式存储,处理起来比较麻烦,写了半天。时间复杂度不知道是\(O(n^3\log n)\)还是\(O(n^2\log n)\),反正挺大的。一开始交上去全都TLE,气炸了,本地一跑,\(500\)的样例好像只要\(4\ \mathrm{s}\),顿时又有点希望。开个O2,变成\(3\ \mathrm{s}\),O3也是。再加了一个二分,又改了个小错误,一测\(1.5\ \mathrm{s}\),交上拿下Subtask 1。后面不知道怎么的,也许是交的人少了评测机轻松了,居然\(\overline{19??}\ \mathrm{ms}\)极限过了Subtask 2。可见数据实在很水。
D. 图论题
给定有向图\(G=(V,E)\),每个顶点\(i\in V\)表示一个任务,有一个优先级\(p_i\in\mathbb{N}\cap[1,10]\),还有一个价值\(v_i\in\mathbb{Z}\)。一个任务集合\(S\subseteq V\)是合法的,当且仅当对于任何\(i\in S\),若图上存在一条从顶点\(i\)到顶点\(j\in V\)的有向路径(即能够从\(i\)到\(j\)是可达的)且\(p_i\geq p_j\),则必有\(j\in S\);换言之,一个合法的任务集合必须满足对其中任何一个顶点,其可达点中优先级小于它的也都在这个集合中。对所有合法集合分别求价值和,求这些价值和中的最大值。
\(20\%\)的数据\(\lvert V\rvert\leq50,\ \lvert E\rvert\leq n(n-1)\),\(50\%\)的数据\(\lvert V\rvert\leq500,\ \lvert E\rvert\text{记不清了}\),\(100\%\)的数据\(\lvert V\rvert\leq5000,\ \lvert E\rvert\leq100000\)。好像无重边自环?价值有正有负,\(\forall i\in V\ (|v_i|\leq10^5)\)。
想了半天也不知道怎么做。据说取\(S=V\),把价值全加起来就能得\(20\)分,这数据也是水得没边了。
E. 优化题
一共有\(proc\_num\)个线程,\(gpu\_num\)个显卡,\(mem\_num\ \mathrm{GB}\)的内存。现在依次有很多个任务(不知道有多少)要执行,一条线程同一时间只能执行一个任务。第\(i\)个任务需要占用\(gpu\_req_i\)个显卡和\(mem\_req_i\ \mathrm{GB}\)的内存,有一个重要度\(signif_i\),有若干个存档点(但事先不知道多少个,任务结束才知道;起点算一个,终点不算),相邻两个存档点间的时间是\(d_i\)。评测程序会在发生以下事件的时候通过调用函数来告知选手:
- 某个任务达到存档点。
- 某个任务结束(此时才知道它有几个存档点)。
- 新增一项任务。
- 选手代码预约的时间点。
选手代码需要实现事件处理函数,其可以调用以下两个函数来告知评测程序:
- 让某个线程执行某一项任务。如果这个线程当前有任务,当前任务会被打断而回到此前最后一个存档点,同时此线程开始执行新的任务。
- 预约未来的某个事件点,让评测程序在那时调用选手的事件处理函数。
如果事件\(i\)的实际存档点数量为\(c_i\),实际执行时间(从新增到结束,包括等待时间)为\(t_i\),则其产生的损失为\(signif_i\cdot\frac{t_i}{c_i\cdot d_i}\)。目标是在线程、显卡和内存约束下使总的损失最少,即要使
\[\sum_{i=1}^{task\_num}signif_i\cdot\frac{t_i}{c_i\cdot d_i} \]
最小。
绝对不可以超越线程、显卡和内存的限制,否则直接爆0。
除了损失以外,一切操作都在正整数的范围内考虑。
写了半天觉得很麻烦,又看CD去了。据说暴力就能得\(100+\),有点后悔。😔
思想感情
这半年基本都忙于文化课的作业,算法能力不进反退,奇技淫巧显著提升。但又忘了当年考NOIP是怎么骗分的,这还IOI赛制(基本上)呢,D题都没骗点分到。我真傻,真的。
对自己的代码能力没有信心,E题写一半放掉了,亏大了,旅游肯定没戏了。
早上吃了一碗方便面和两个煎鸡蛋,买了一杯瑞幸。下考才喝完。
结束前憋了一个小时的屎,因为在试图卡掉C题后两个子任务,但很可惜时间不够(因为我的处理有点复杂)。
学校太偏了,来去四小时,地铁挤死人,又闷又热。
考前总想到莫队,临时抱佛脚把模板看了一下,然而没用上。据说C能用,但我不会。
考场电脑很难用,非常卡,卡成屎了还装360,这种重启就复原的电脑装360干甚么。关了还是卡。键盘也有很神秘的bug,连按两下回车再按上 键,实际上会打两个换行再往下移动一格,不知道是甚么意思。VSC插件不知道装的甚么版本,非常怪。好在CACC时间充足,我得以稍微调教一番,但仍有诸多不习惯之处。还总是搞出那个控制学生端的甚么域的软件,非常烦人。
回来和佬吃了好吃的菜,吃撑了。
期末考试和爪哇大作业正在等着给我迎头痛击,我不能写了。