NOI挑战赛#2 (vp) 记录

NOI挑战赛#2 (vp) 记录

赛场:69+0+10

赛后:69+0+100

题解

T3

题意:给定 \(S,C\),求有多少个 \(s\in[1,S],c\in[1,C]\),使得:存在若干个整数边长的矩形,它们周长的和为 \(c\),面积的和为 \(s\)

\(S,C\le 10^6\)。几档小部分分是100,2000,6000,30000,100000,400000。

(只会这一个题)

对于一个 \((c,s)\) 如果它满足条件,给 \(c\) 加上 \(2\),给 \(s\) 加上 \(1\),同样满足

(即,加上一个 \(1\times 1\) 的矩阵)

因此,对于 \((c_0+2k,s_0+k)\) 这样的,如果 \((c_0,s_0)\) 满足,就全都满足了

注意到所有这样的点构成一条直线,直线的本质区别在于截距 \(2s-c\)

那我们枚举这个截距 \(i\),找到最小的 \(s_0\) 使得 \((2s_0-i,s_0)\) 可行,那对于 \(s>s_0,c=2s-i\)\((c,s)\) 一定也是可以的

\(f(i)\) 表示最小的 \(s_0\) 使得 \((2s_0-i,s_0)\) 行,那问题就是求 \(f(i)\)

暴力的枚举一对 \((c,s)\)\(O(n\log n)\) 的。再去枚举 \(i\) 更新 \(f\),就是 \(O(n^2\log n)\)

\(g(i)\) 表示最小的 \(s_0\) 使得 \((2s_0-i,s_0)\) 可以由 一个 矩形搞出来。先预处理出 \(g\),再用 \(g\) 更新 \(f\)

更新 \(g\)\(s\xrightarrow[cmin]{} g(2s-c)\),这个 \(O(n\log n)\)

更新 \(f\)\(g(i-j)+f(j)\xrightarrow[cmin] f(i)\),这个 \(O(n^2)\)

注意到我们去掉了一个 \(\log\) ,相当于是预处理掉了。这样据说就能拿不少分了,实现的好甚至可以拿到80多

那怎么拿100呢?观察第二个转移,暴力输出每个最优的 \(j\),发现它都在200以内,\(O(200n)\) 直接水过

小 技 巧:对于一个限制不多,输入很少,题面很短(讲人话:比较数学)的题目,如果用(复杂度不对的)dp做,通常转移会比较有规律,可以打表观察

赛场记录

我他妈人傻了啊我艹,这啥题啊

泡一杯咖啡,稍微迟了点,8:15开的场,定时闹钟5h

看第一题 -> 有了思路 (去上了个撤硕)->发现思路假了

撤硕是一个充满魔法的地方,我每次去撤硕里都思维特别活跃,发现做法假了或者想出新做法

继续想,⑧会,看T2

看完T2,我脑子一转,这咋做啊,完全没有头绪(题解也完全没懂)

准备打一个 \(O(2^n)\) 的暴力,\(n\le 15\)。然后仔细一看发现这个数量其实是 \(2n\),所以复杂度会到 \(2^{30}\),然后就傻了

去看了T3,仔细一想发现不会正解,退而求其次次次次次次,发现我只会 \(n^5\),而最小的 \(n\) 有 100 那么大

此时时间过去了2h,我却已经获得了0分的高分。

但是我的低配大脑长期这样运转,不太能吃的消。再加上今早起的早,没睡够,就睡着了

睡了5min多,脑子里想起来我还在比赛,啪的一下就起来了,跟他妈诈尸一样

我的T2基本上就放弃了(事实证明这个决策是对的),我去主攻T1T3

我发现我的T1问题在于只比较一个串,如果同时比较一堆串接起来其实就对了。然后我就暴力的实现了这个比较。期望得分18。由于数据比较水,最终我的暴力比较跑的飞快(因为我有很多break,且串的LCP非常短),只有最后一个subtaskT掉了,喜提69的高分

我还去想了T3,把那个 \(O(n^5)\) 的超高速dp,优化到了 \(O(n^4)\)

然后我又想,对于一个面积,周长的方案数是面积的因数个数,因数个数加起来,其实是个调和

然后这个dp就优化到了 \(O(n^3\log n)\),终于有分了,获得了10分的超高分!!!

后来,比赛还有30min结束的时候,我注意到,对于一个 \(s\),满足条件的 \(c\) 大致在一个区间里,而只有小部分空缺

我就打表,存每个 \(s\)\(l,r\),还有空缺。理论需要跑5~6min,实际跑了20min,因为跑第一遍RE了,我改了几下,再调了一会,重新跑的

事实证明这个空缺是真的少,存储空缺的表用了35K,但是存l,r的表用了他妈48K,而noi.ac这个垃圾网站只允许交50KB的代码(NOI赛场是100KB),我只好压缩一下这个表,就在打好的表上做修改,取个差分,二进制+char的压缩,等等。但是压缩那个表的程序由于太长了,本地渣机编译失败了,时间也不太够了,一阵手忙脚乱还是没搞出来,痛失10分!!!(表打出来就有20了)太可惜了!!!

至此,比赛结束。我打了 18+0+10=28分,获得了69+0+10=79分,挂了-51分。

耗耗反思

  • 当发现比赛题目全他妈不会的时候,冷静下来,从最naive的部分分开始想,心态千万不要乱。如果困可以睡,也不要怕睡觉多浪费时间,如果脑子困,这是唯一方法
  • 去上个撤硕冷静一下
  • 脑子里完全没想法的时候,如果不想傻愣着,可以试试去打表 (别比赛快结束了打表程序没跑完)
posted @ 2021-08-04 19:38  Flandre-Zhu  阅读(70)  评论(0编辑  收藏  举报