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 才刚上银牌线,乌乌乌,我好菜呀。

打铜了,好伤心,😭😭😭😭😭😭😭😭😭😭😭😭😭😭😭😭😭😭

posted @ 2022-08-06 23:25  Ilith  阅读(179)  评论(3编辑  收藏  举报