UNR 参赛小结
Day 0
咕了,喜提笔试 \(0\) 分。
Day 1
\(65+100+0=165\)。
T1
hehe 蚤面基了一个人之后,可以认为这个人一直贴着他走,那么终状态一定是所有人齐聚一堂。
而所有人齐聚一堂时,一定可以直接光速依次面基所有人,故找一个点,到所有人最短路距离的最大值最小即可。
但我没开 long long
,白挂 \(35\) 分。
T2
对最终串计数,最终串是长度为 \(2t+n\),并且 0
, 1
的数量都是已知的。
考虑如何判断一个最终串 \(T\) 是否合法,一个自然的思路是,把 \(S\) 放上去贪心匹配:在两字符相等的情况下匹配之,反之若匹配之能使得未匹配的字符中 0
的个数不小于 1
的个数则匹配,否则不匹配。
但是这样有一个问题,若 \(S\) 当前需要匹配的字符是 0
,最终串当前位是 1
,肯定匹配不了,但如果加上这个 1
的话会使未匹配的字符中 0
的个数比 1
的个数少,就寄了。
我直接爆猜一个结论:如果遇到这种情况,就把 \(S\) 的匹配从后往前退掉,一直退到第一个位置,使得未匹配的字符 0
, 1
个数相等。
- 必要性:此时 \(S\) 匹配的最长前缀,一定满足未匹配字符
0
,1
个数相等,这个位置是最右的一个; - 充分性:我退掉的东西,除了最后一个退的
0
外,一定是括号序列,与原未匹配字符合并肯定没影响。
然后就可以直接压进状态 DP 套 DP 了。
T3
没有时间了,没仔细想。
Day 2
\(100+30+20=150\)。
T1
鸽笼原理,子集有 \(2^n\) 个,\(p<2^n\),必然有解。也就是,我只要在 \([0,p-1]\) 找出一个 \(x\) 使得至少有两个子集和为 \(x\) 即可。
可以二分找,比如我现在确定 \([l,r]\) 中必然存在一个合法的 \(x\),那么我检查和在 \([l,mid]\) 中的子集数,若超过 \(mid-l+1\) 则 \([l,mid]\) 一定有,否则 \([mid+1,r]\) 一定有。
检查子集数,这个可以折半,算出两半的子集和之后双指针,总的复杂度是 \(O(2^{n/2}\log p)\)。
T2
... 不会,\(2\log n\) 暴力走人。
思路大概就,类似于你发现对俩边集询问出的连通块结果取交,得到的连通块结果是俩边集交集的连通块结果。然后直接二进制分组,把 \(0\) 问问把 \(1\) 问问。
但是我连暴力都写 T 了,真是小丑。
T3
... 不会,前两个子任务暴力走人。
总分是 \(0+(65+100+0)+(100+30+20)=315\),对比 NOI2021 才刚上银牌线,乌乌乌,我好菜呀。
打铜了,好伤心,😭😭😭😭😭😭😭😭😭😭😭😭😭😭😭😭😭😭