noi2023 游记
?~7.1
学考。
7.2
晚上打了把 arc。F 原题过了。找了一整场 E 的规律,最后找出来一个奇怪的东西 /oh。
7.3
联考是我的模拟赛。去武汉。
7.4
早上模拟赛 t1 跑两次 km 没清空,t3 没写完。
晚上感觉很困,想先去开场 div2 练练手。先打开了个 div2 的 f,看了会儿突然发现怎么 d2F=d1D!!于是干脆做这场 div1 了,好像题目都比较简单的样子。
7.5
下午是 isij 杯赛,总共三个题,前两题是我的题。
比赛开始的时候我们都没有拿到能看到题的账号。我觉得这场比赛估计和我没啥关系了就去 vp 上场 div1+2 了。
打了十几分钟突然告诉我有账号了。哦。登一下。t3 怎么是原题啊??不管了不管了。继续 vp。
过玩前面的题后又去看了眼 isij,怎么我的题的时限空限被改了啊??怎么我的部分分表被删了啊??
?????
很火大,告诉金老师让他们改回去。
继续 vp。I 不太会啊,但是根号好像不难。
isij 主办方又和我们说不改???说部分分表是评测内部信息没有必要公开??我还放了一些特殊性质呢???
?????
I 根号写完了。写个对拍拍一拍。
过了拍之后交上去还是 wa 了。
最后在那里瞎改,最后一分钟的时候!终于不 wa 了!但是 TLE 了!!
调了调块长,赛后三分钟过了!!!!!都怪 shaber isij。
最后看了眼 isij 榜,共五个人过 t1,t2 最高分 45,还算比较符合预期。
晚上写了上午口胡的 UOJ632,感觉这题很趣味。
题解
核心结论: 这题构造出来的图是 https://codeforc.es/contest/1792/problem/F2 中所描述的图。
证明可以增量,构造树形结构也可以增量,复杂度 \(\Theta(n^2)\)。
7.6
模拟赛 ak 了。
下午我干什么了?好像摆过去了。
晚上做了一下 gym104337G,好题。
题解(另解)
首先这个 \(998244353\) 和 \(8 \times 10^6\) 提醒我们从单位根考虑。我们只询问单位根。
下面记我们要猜的多项式是 \(A(x)\),系数是 \(a_i\)。
注意到询问所有 \(\omega_{2^l}^i\) 可以做单位根反演。
因此考虑设计一个函数 \(P = F(2^l)\),做完这个函数后可以得到 \(P_k = \sum_{i=u\times 2^l+k}a_i\)。
这个过程事实上是对点值做 IDFT。
我们可以怎么做 IDFT 呢?先算出 \(Q=F(2^{l-1})\)。然后执行 \(A(x)=A(x\omega_{2^l})\),然后算出 \(H=F(2^{l-1})\)。
注意到 \(Q_i = P_{i} + P_{i + 2^{l-1}}\),\(H_{i}=(P_i - P_{i+2^{l-1}})\omega_{2^l}^i\),所以可以通过 \(H,Q\) 解出 \(P\)。
注意到 \(Q_i = 0\) 时,\(P_i=P_{i+2^{l-1}}=H_i=0\)。而只有 \(1000\) 个 \(Q_i \neq 0\),因此算 \(H\) 的时候,能不能找到一些更快的方法呢?
我们把 \(A\) 中的 \(x\) 乘过 \(\omega\) 的函数分开来,设为 \(G(2^{l-1},w)\),没有乘过的才直接定义成 \(F\)。
在 \(G\) 中,一些位置已经被确定,一些位置还没有被确定。
首先仍然把问题分成两半,\(Q=G(2^{l-1},w),H=G(G,w\omega_{2^{l}})\)。
但是这样两边非零项的个数都是原来的数量,非常不牛!
怎么优化呢?
如果 \(G_i,G_{i+2^{l-1}}\) 都不知道,就把 \(Q_i,H_i\) 都标记成不知道。
如果都知道,那么就可以算出 \(Q_i,H_i\)。
如果有一个不知道,那么算出 \(Q_i\) 后可以直接算出 \(G_{i},G_{i+2^{l-1}}\) 的值,因此 \(H_i\) 也知道了。
注意到这样,\(Q,H\) 中不知道的个数恰好就是 \(G\) 中不知道的个数,所以我们递归到 \(l=0\) 的时候不知道的数量仍然一样,所以就做完了!!
7.7
上午打模拟赛,后面忘了。
7.8
早上听讲课。
下午看课件。
晚上口胡了一下 UOJ783 的 subtask2。subtask1 好像当时会做就不看了。
题解
UPD : 这个做法好像有点问题,大概只能做到 \(n^{5/3}\).
- 对座位分块。块 \([l,r]\) 满足以下两个条件之一:
-
- \(l=r\)。
-
- \(\sum_{i=l}^{r} (cnt_i+1) \le B\)。其中 \(cnt\) 是包含 \(i\) 的操作个数。
第一种特判。第二种考虑只有 \(B\) 个操作,记录 \(F[l,l']\) 表示操作是从 \(l\) 开始的,如果现在从 \(l'\) 操作开始走,走到什么时候能走完这一段值。
再对位置继续进行分治算出 \(F\) 即可。复杂度单根号。
7.9
早上我们讲课。
下午打锣鼓的原神场,怎么有信息压缩提阿??
晚上打 arc,想到了做法但是以为是错的。被打包了。
7.10
上午 xcyle 模拟赛。
晚上在学 pjudge 养鸡。太难了!!
题解
考虑把一部分的流量分到右边,另一部分分到左边。
这里我们要求丢到右边的流能够流满,而丢到左边的流量要满足 \(l\) 尽可能小。
最小割告诉我们,右边的最大匹配为:
设 \(s_p = \sum_{l_j \le i \le r_j \le p} c_j - \sum_{j=i}^{p} a_j\)。那么 \(s_p\) 的意思就是说,对于 \(l_j \le i \le r_j \le p\) 的区间,我们至少要将 \(s_p\) 的流量丢到左边。
怎么丢呢?找到 \(s_p\) 的前缀最大值,在 \(p\) 前的流中,贪心把 \(l\) 最小的那些流丢到左边去。
我们要维护的,就是这个丢的过程!
我们 \(i\) 从前往后扫。
扫的过程中对 \(s\) 做的操作就是:
- 删除 \(r=i\) 的区间(\(s\) 全局减 \(c_j\))。
- \(a_{i}\) 删去(\(s\) 全局加 \(a_i\),并删去第一个位置)。
- 加入 \(l=i+1\) 的区间(后缀加 \(c_j\))。
注意到这样就只有后缀加操作会改变优先顺序!而后面的元素一直在变优!所以一些流一旦被丢到右边,那么他一定就一直留在右边了。
所以说啊,这样我们就有一些看起来比较合理的做法了!!
每次找到全局最大值 \(i_r\)(多个取最左的)。在 \(i_r\) 前找 \(l\) 值最小的 \(pos\)。然后 \(pos\) 前找上一个前缀严格最大值 \(i_l\)。然后用 \(pos\) 给左边 \(\min(c_{pos}, s_{i_r} - s_{i_l})\) 的流量,在 \(s\) 上进行修改。
睡觉的时候突然发现我好像会了 积性函数 \(O(n^{0.5+o(1)})\) 做法了!很兴奋,睡不着。
7.11
上午吃模拟赛。
下午实现了一下那个积性函数求和做法的一部分,然后写了篇博客。
晚上好像啥也没干。
7.12
上午听讲题
思考了一下乘和式模 \(2^k\) 的做法,想到了一个差不多的做法。唯一不同的是我利用了“当矩形 \(\bmod 2\) 的秩 \(\le n-(2k-1)\),那么答案为 \(0\)”,而他的做法是加若干行。
7.13
模拟考试。
被打包了。
7.14
模拟考试。
没有被打包。
7.15
UNR Day1!
先粗略看了眼题,以为有两个博弈,害怕。
先瞪 T1,我会二分!二分完猜了个结论,错了。又仔想了半天发现只有奇数位有用!然后过了。
然后看 T2,是不是乱搞题啊!先搞了一个,摁优化了一下大概就到了 \(1.6e5\)。
然后做了半天,搞了个奇怪贪心过了。
T3 想了一会儿发现了做法,很好玩啊!写了好久,最后二十分钟过拍了。
下午看发现没有挂分,非常感动。听说 t3 只有我写了正解!
感觉这场比赛也不差啊!怎么这么多人差评啊!
7.16
UNR Day2!
看 t1。感受了一下,答案大概是取 \(b\) 最大的几个。
理性分析了一下发现确实只有 \(b\) 第 \(k\) 大的可能不是答案。
然后就可以做了!过了过了!
t2 第一眼是枚举最大值,然后枚举最紧的限制,DP 记录多元生成函数。感觉不可写。
然后感觉数位 DP 状态数非常少,于是写了写,发现不太行啊!竟然只能过 \(n=4\)。
理性分析了一下前面的想法,发现枚举最大值是不必要的!多元生成函数也是不必要的!
哦哦哦,那这样就是 \(n!2^n \operatorname{poly}(n)\) 的了啊!太对了!然后过了。
做 t3,秒了单根做法。先把 \(30\) 写了,最后还剩 \(75\) 分钟,可惜没有冲完。
不过也挺好,还是 rk1。
7.17
回杭州。
看病。
7.18
早上模拟赛题目挺好,不过也 ak 了。
看了眼 pjudge,写了个 t3。
题解
首先如果不跨 x 轴,就是把每个点分配到上面 / 下面,栈一样的匹配。
如果跨 x 轴,那么可以把下面的点翻折到上面,然后就是在一条线上,仍然是像栈的匹配。
把限制写出来发现可以 2-SAT。
7.19
早上模拟赛题目挺烂,写一半不想写了。
看了眼 pjudge,写了个 t3。
题解
首先先把线图上的 \(K_t(t \ge 4)\) 判掉:这些原图上的边,一定连接着原图上的同一个点。
删完后,在线图上就只剩下 \(K_3\) 了(原图每个点度数 \(\le 3\))。同时,线图上每个点的度数都不超过 \(4\)。
给每个 \(K_3\) 设一个变量,发现这些变量同样可以建 2-SAT!然后就做完了。
7.20
好像感冒了。而且昨晚没睡好。所以没去学校,模拟赛开始后先睡了 2h。
t1 些了个巨大麻烦做法,t2 不会。t3 没做。
最后大家成绩也差不多吧。
7.21
早上睡觉
下午看 hhz 模拟赛。怎么搬的题题面错了啊?做了半天发现不会做菊花 /cf。
7.22
坐飞机
7.23
开幕式的时候出了学考成绩,3A1B,对我来说挺好。
笔试,简单的。写了个 noipt3。
听说有像 uoj 那样一键测样例的东西,这么牛!不过不知道笔试的时候就有,所以没用。
不打板子。
7.24
看 t1 马上会了,三十分钟搞定,但是 selfeval 怎么一直测不出来啊?
然后有个工作人员帮我把 selfeval 敲命令关掉了。
看 t2,画了几下也就会了,过了样例就扔了。这个时候还不到 1h,怎么输!!
推了推 t3 很快会了一个 \(\operatorname{poly}(n)\) 的做法。但是因为做了一个不太好的转化,导致没法做这题!甚至没法做 B 性质!然后搞了半天也只会点分治 2log。
然后试图想一些其他方法,想到了一个看似很高妙的拆贡献做法?
写了下,过了前两个样例!
测第三个,wa 了?
测了一下,发现结论假了!!
感觉又把优势全打没了啊???????
这个时候还有 100 分钟的样子。先把 \(n \le 300\) 写了。然后试图冲 2log 做法,最后二十分钟感觉调不出来了就拼了个 A 性质跑路。
期望得分 \(100+100+72\),实际得分 \(100+100+72\)。
刚开始感觉考得挺平凡,出场的时候甚至听有人说一堆人 ak;但是问了一圈好像没有 ak 的,查完分之后甚至听说只有 \(4\) 个 \(270+\) 就感觉不错。
听讲题,感觉好像 t3 挺憨的啊!算了可能我更憨。
7.25
嘉年华去得比较晚。
玩飞盘高尔夫,飞不进。
玩高尔夫,好难。
玩瞎子敲锣,玩之前感觉很简单,不过玩的时候很小丑啊!不过还是过了。
玩眼疾手快,怎么只抓到两个啊!
这个时候还剩大概二十分钟的样子,摆烂了。
于是不停地玩飞盘高尔夫,飞了若干次后过了。
然后玩飞盘,好像只扔了两次 \(0+2\) 就给我过了?
于是就有纪念品了。
然后去玩高尔夫,进了。
随便看了几眼,看 hdu 多校,03 比较好写写了。07 不会 QAQ。不会博弈。
7.26
t1 很快秒了。30 min 搞定。
t2 想了会儿,发现事实上本质是要对回文串算一个偏序啥的。
建回文自动机,用经典套路可以做到 2log。
但是 2log 看起来过不去的样子。但是发现同一个等差数列的节点上,权值是有单调性的,因此可以直接二分。
感觉很对。于是写写写,先写个暴跳 parent 吧。
赛前没打板子,还是回忆了一下 SA 和回文树怎么写。SA 写了 2log。
测测样例,发现 T 了。但是竟然是因为 SA 太慢 T 的!于是把 SA 改成 1log,不过改了好久才改对。改对之后就过样例了。
然后写倍增。写完后测了几组好像都挺快的?
想了想,发现等差数列的 \(\sum \log len\) 是 \(\Theta(\log n)\) 级别的,所以是可以过的!
感觉大样例有点弱,就先写了个对拍,改了个错以过了几万组的拍。这个时候 2.5h。
看 t3。理性分析,推推性质,猜猜结论,得到了一个复杂度是拆分数乘以 \(\operatorname{poly}(n)\) 的做法。
感觉能过 \(n \le 28\) 啊!写个先。
写完之后发现怎么样例都这么大啊!
于是先写了个暴力,调了几下就能过手捏小数据了。
然后我测了一下 \(n=20\),飞快啊!
\(n=30\),同样飞快!
\(n=40\),还是能跑!
然后一一测过去,测到 \(n=100\),也跑过去了!
太震撼了!
selfeval,启动!
0.05s!100 分!
是不是 ak 了!一看时间,4h!
给 t1 写了个拍子。过拍了。
写完拍不知道干啥,开摆了。
比赛的时候一直在喝水和上厕所,最后总共喝了 5 瓶水。而且举手找监考的时候经常找到 EI!!
估分 \(100+100+100=300\)。
下午查分发现 t2 了 \(8\) 分,太不牛了!
仔细一看,是我为了卡常没倍增满,多测没清空,还没拍出来!
实际得分 \(100+92+100=292\)。
总分是 \(5+100+272+292=669\),赢!