THUSC/PKUSC 2024

THUSC 2024

Day1 A

给定非负整数 \(d,n_1,n_2,\cdots,n_d,p,L\),求

\[\sum_{i_1=0}^{n_1-1}\sum_{i_2=0}^{n_2-1}\cdots\sum_{i_d=0}^{n_d-1}\max((i_1\oplus i_2\oplus\cdots\oplus i_d)-L,0) \]

\(p\) 取模的值。有 \(T\) 组数据。不保证 \(p\) 是质数。

\(1\le T\le 10,1\le d\le 10,1\le n_i\le 10^{18},1\le L\le 10^9,2\le p\le 10^9\)。 1.5s

Day1 B

给定正整数 \(k\) 和字符串 \(S_1\),求最短的字符串 \(S\),满足:

  • \(S_1\)\(S\) 的前缀。
  • 所有长度为 \(k\) 的由小写英文字母构成的字符串 \(T\) 都是 \(S\) 的一个子序列。

\(1\le k\le 10^5,1\le |S_1|\le 2\times 10^6\),可以证明在此约束下答案存在且长度不超过 \(4\times 10^6\)。1s

Day1 C

给定一棵 \(n\) 个节点的树,每条边 \((u_i,v_i)\) 有边权 \(w_i\)。部分边已经定向,其余边还未定向。

你需要给未定向的边定向,定向之后会得到一个 DAG,你需要最小化这个 DAG 中最长链的长度。

\(1\le n\le 2\times 10^5,1\le w_i\le 10^9\)。3s

Day1 D

提交答案题,类似于 WC2015 未来程序

Day2

前三题模拟 wordle,第四题需要根据信息熵提示下一次的推荐词,第五题是直接和交互库玩 wordle。

PKUSC 2024

Day1 A

给定 \(2\times n\) 的字符矩阵,你可以从任意位置出发,只能往右或往下走,不能超出边界,可以在任意位置结束。

把你经过的所有字符记录下来,你希望得到的字符串是一个回文串。

在此基础上,你希望最大化这个回文串的长度。输出可能的最大长度。

\(1\le n\le 10^5\),字符是小写英文字母。1s

Day1 B

给定一个 \(n\) 个点的凸包,问有多少种方案从这个凸包内(包括边界)选出四个无序的整点 \(A,B,C,D\),满足它们构成一个正方形。注意正方形可以斜着。

\(3\le n\le 8\),凸包上的点的坐标的范围是 \([0,2000]\)。4s

Day1 C

给定一棵 \(n\) 个点的树和正整数 \(m\),每个点的点权 \(a_i\)\([1,m]\) 中随机,求其最大权独立集的权值和的期望。

答案 \(\bmod 998244353\)\(1\le n\le 2000,1\le m\le 10^8\)。好像是 5s

Day2 A

给一个 \(n+1\) 个点的 DAG,满足除了 \(n+1\) 号点,每个点 \(i\) 恰好有两条出边 \(i\to to_{i,0},i\to to_{i,1}\),而且满足 \(i<x_{i,0}\le n+1,i<x_{i,1}\le n+1\)(这里 \(x_{i,0}\) 可以等于 \(x_{i,1}\));除了 \(1\) 号点,每个点至少有一条入边。

有一个 \(01\) 序列 \(b\),初值给定。定义 work(u)

work(u):
	if u == n + 1 :
		return 
	v = to[u][b[u]]
	b[u] = b[u] xor 1
	work(v)

求最小的 \(T\ge 1\),满足执行 \(T\)work(1) 后,当前的 \(b\) 序列和初始的 \(b\) 序列相同。

\(1\le n\le 50000\),1.5s 768MiB

Day2 B

给定 \(n\) 个区间 \([l_i,r_i]\),定义 \(f_i(x)=x+[x\in[l_i,r_i]]\),有 \(q\) 次询问,每次给出 \(L,R\),考虑一个数 \(x\),初始 \(x=0\),现在依次对 \(i=L,L+1,\cdots,R\) 执行 \(x\leftarrow f_i(x)\),求 \(x\) 最后的值。

\(1\le n,q\le 10^6,0\le l_i\le r_i\le n\),忘了时间限制了,可能是 1s 或者 2s

Day2 C

给定一张 \(n\)\(m\) 边的随机带权有向图(可能有重边自环),\(q\) 次询问随机两点之间的最短路。不可达输出 \(-1\)

具体来说,图的 \(m\) 条边的两端点 \(u_i,v_i\) 都在 \([1,n]\) 中独立均匀随机,边权 \(w_i\)\([0,2^{32})\) 中独立均匀随机;每次询问给出的两点 \(s,t\) 也都在 \([1,n]\) 中独立均匀随机,且上述提到的每次随机互相独立。

\(1\le n\le 2\times 10^5,1\le m\le 3\times 10^6,1\le q\le 10^4\),10s 1024MiB


来点游记!省流版:THUSC \(390+498.88=888.88\)(很有意思的分数),PKUSC \(220+215=435\)

THUSC Day1

怎么下雨了?操吴戈兮被犀甲

看到 T1 之后秒了,大概 20min 左右过了。

看完 T2 发现又秒了,写了 15min 过了。

?什么情况啊这。感觉 THUWC 的题和这个完全不是一个画风啊。

看 T3。怎么这么熟悉啊,这不是我 2022 年搬到 noip 模拟赛 T1 的题吗,也太糖了吧。

稍微思考了一下带权有没有影响,发现完全没影响。

写了一个 \(O(n\log n\log V)\) 的过了所有大样例,交上去发现 wa 0。

开拍!\(O(1)\) 组就拍挂了,好一个大样例。稍微改了改就 ac 了。这个时候才过去 1.5h

感觉优势在我,看完 T4 觉得很有趣,开做

第一个点很容易发现就是输入 \(x\),对 \(i=0,1,\cdots,m\) 输出 \(i\times x\)。启动一下快速幂,发现获得了整整 \(2\)

写了一个搜,由于懒得写代码直接钦定了过程中只用 \(2\) 的 space,发现搜出来刚好能过。车错毂兮短兵接

一看 \(2,3\) 发现也是这,搜一下也刚好能过。还挺牛

看了下 \(4\) 发现不知道在干嘛,一开始试图找找规律,发现看不懂一点

突然想到这个答案一定是输入的那个 \(a_0\) 的倍数,那我输入 \(1\) 不就可以知道他在干啥了?

发现是输出 \(a_0\times 75497471\)。旌蔽日兮敌若云

写了个快速幂,发现得跑 \(36\) 次,可以获得整整 \(0\) 分。

优化了半天才优化到 \(34\),感觉对要求的 \(\text{time}\le 30\) 毫无头猪

很自闭,把这个数的二进制打出来,发现他是 \(2^{23}+2^{26}-1\)

想到这里有个 mod 998244353。

打了一下 \(998244353\) 的二进制,发现是 \(2^{23}+2^{24}+2^{25}+2^{27}+2^{28}+2^{29}+1\)

诶,这不是刚好补上了?也就是说,\(2^{30}\bmod 998244353=75497471\)。矢交坠兮士争先!!!!

那不是无敌了?直接给自己加 \(30\) 次,然后过了。感觉很有意思

\(5\) 是区间求和,一开始想前缀和发现还得算减法,于是写线段树。很快过了。

\(6\) 还是区间求和,但是时间比较紧。改成猫树,过了。

\(7\) 还是区间求和,但是时间比较紧,空间更紧(只有 \(n\))??

想了想发现可以前缀和,唯一的问题是 \(\times (\text{mod}-1)\) 怎么做。优化了一会得到了 \(32\) 次的做法,然后就过了。

\(8\) 看了一会发现是狄利克雷前缀和,但是还要单独算 \(8191\)\(8192\)。那这不是随便做,写完就过了。

\(9\) 因为有了 \(8\) 的经验,看一眼就发现是高维前缀和。直接 FMT 就过了。

\(10\) 感觉毫无头猪,找了半天规律也不知道在干啥,完全没做法。坐牢 1h 然后遗憾离场orz

晚上狠狠过星铁剧情。

THUSC Day2

一看题,怎么是 wordle??这不是我们 WC2022 吗

\(1\sim 3\) 很快就过了,这个时候发现加了条公告,诶那我 T2 不是理解错了吗,怎么过的。

难道今天还是只测 pretest?在提问区问了一下(由于没有输入法,只能从题面里面复制各种汉字。。。),得到的回复是:

无可奉告

受不了了。。。。

好吧,硬着头皮改 T2,改完又过了。然后稍微写了一下 T4,发现也过了。凌余阵兮躐余行

最后写 T5,按照他说的每次选信息熵写了一发,发现直接通过了 easy mode,但是 hard mode TLE 了。

加了点特技来维护,获得了 \(93\) 分。

又加了点特技,获得了 \(98.31\) 分。

改了改随机种子和一些参数,调到了 \(98.88\) 分。

这个时候发现,诶,我的总分刚好是 \(888.88\),那我还做集贸啊,睡觉!

于是就开始摆烂。最后得分就是 \(888.88\)。左骖殪兮右刃伤

下午颁奖,要赶高铁,所以没时间领奖了/ll zyc 说我是 1=

但是我并没打算报 t,怎么把 rp 全都用在 THUSC 上了?

PKUSC Day1

看完 T1 就会做了。写了一发,大概 20min 的时候交上去,荣获全 wa

好,直接开拍。拍了一会挂了,改改改,调了半天发现是暴力挂了。霾两轮兮絷四马

然后好像拍了几百组也没挂,交上去发现,第一个包和最后一个包过了,反而没有过 sub2。什么牛魔数据啊这。

这个时候回来看对拍,发现拍挂了??看了半天,发现是之前暴力挂的那一次把 std 也改挂了,于是改了回来。

怎么拍不出来了?

交一发。

怎么过了????????????我觉得这个代码和第一发交的代码一模一样啊。。

反正过了就不管了,这个时候大概 40min,开始做 T2

发现去年 myee 有个 CSP 模拟赛,那个 T1 就是在和这个做一样的事。

把那个题 \(O(\frac{V^4}{w})\) 做法抄过来就过了 \(V\le 300\)。然后写了写过了长方形的 sub。援玉枹兮击鸣鼓

发现不会优化了。诶好像会了,发现那个做法里面 bitset 根本没必要,实际上 \(1\) 的位置是一个区间。

于是写了个 \(V^3\) 过了 \(V\le 800\)。发现三角形的时候这个容易做到平方,于是三角形也过了。这个时候获得 \(85\)

感觉三方很有希望过 \(2000\),保险起见先问问能不能用 pragma,在提问区发了一个

ke yi yong #pragma ma ?
----------
ru ti

很快得到回复“可以”,于是加了个 unroll-loopsOfast,本地测了一些感觉很极限的数据,都只要 3s。

那不是无敌了?交上去发现 TLE 了。天时怼兮威灵怒

为啥啊?改改改,但是不管咋改都是 T。甚至把三角形的部分特判删掉,那个 sub 硬跑我现在的代码,也只要 1.7s。数据有点太有实力了

算了 \(15\) 分谁写,看眼 T3。发现这不是我们 SDOI2022 小 N 的独立集吗,但是你说得对,但是这个数据范围怎么这么大?严杀尽兮弃原野

吓傻了,把那个题的五方做法抄过来过了 \(n,m\le 20\)。这个时候大约还剩 1h。

感觉后面的都是不可做,遂开始摆烂。出不入兮往不反

出场发现 T3 其实 \(n,m\le 500\) 也很简单,主要是他只需要算 sum。。感觉自己糖丸了

在考场门口找了半天,诶,我包呢??发现相同的位置留下了一个 NOI2023 的包,但是不是我的。

显然这个人拿错包了,what can i say

遇到了教练,通过包里的 THUSC 证书联系到了这个包的主人的教练,然后等了一会成功拿回了自己的包。平原忽兮路超远

晚上和群友狠狠五排。

PKUSC Day2

早上一直在睡睡睡睡睡睡睡睡睡睡。

睡到十一点多起来点了个外卖,吃了一半感觉实在太烂了,实在吃不下。带长剑兮挟秦弓

进考场之前特地把包放在一个旁边一米内没有其他 NOI2023 包的偏远角落(其实一开始想过放在垃圾桶上面,后来感觉还是算了),这次不会有人拿错了吧!!

进场看 T1,感受了一番,一开始没写高精,写了一些完全没道理的东西,过了 \(n\le 20\)

这个时候觉得自己无敌了,于是开始写高精。诶,怎么后面全 wa 了?

一直以为是自己高精写挂了。后来想想,发现自己做法越想越不对。开拍!好嘛,一下就挂了。首身离兮心不惩

然后就是一直改,一直挂,很玉玉。

做了一个多小时,感觉不能这样下去了,于是看 T2。

这不是 shaber 题吗,一开始在编一些复合函数等等东西,后来发现,他的初值是 \(0\),所以有很简单的做法。不太敢相信,先写个暴力冷静一下,暴力得到分之后写了一下正解,很快就过了。这个题总用时约 10min。

感觉心态好了点。看 T3 发现,完全不会啊。除了第一个 sub,后面都是啥啊?感觉一点做法也没有。

回来做 T1,发现很快就会了一个非常有道理的写法。写了一下发现又 wa 了。玉玉

开拍发现怎么拍不挂啊?仔细看看发现高精度写挂了。带长剑兮挟秦弓

很快就过了。看看 T3,硬编了一些做法,过了 \(m\le n\) 和第一个包。首身离兮心不惩

感觉剩下的做不了一点了。开始摆烂,往 T3 代码中加入若干歌词。诚既勇兮又以武

出场发现好多人 T3 \(30\) 哦,那我是不是又糖了。感觉这个题完全没道理,很随机区分。终刚强兮不可凌

题解

THUSC

Day1 A

考虑枚举第一个“存在某个 \(i_j\)\(n_j\) 的二进制在这一位上不同”的位,那么这之前的位的计算结果都已经确定,这之后由于 \(i_j\) 是任取的,所以每种 xor 的方案数都相同,这一位上的贡献可以简单 DP 算出。

时间复杂度 \(O(Td\log V)\)

Day1 B

考虑怎么判断 \(A\)\(B\) 的子序列,发现是贪心每次找第一次出现。

考虑 \(S_1\) 为空怎么做,发现一定是 a-z 重复 \(k\) 遍。

据此我们可以设计 DP,设 \(f_i\) 表示 \(S_1\) 的最短前缀 \(S_1[1\cdots f_i]\) 满足它包含所有长为 \(i\) 的字符串,那么这个可以递推算出,即每次往后找到 a-z 中第一次出现最靠后的一个,然后转移到 \(f_{i+1}\)

现在找到最大的 \(p\) 满足 \(f_{p-1}\le |S_1|\),考虑取长为 \(p\) 的串 \(T\) 满足它不是 \(S\) 的子序列,那么 \(T\) 后面任意接长为 \(k-p\) 的串都得出现过,于是后面至少补 \(k-p\)a-z;同时第 \(p\) 位可能的字符也得补上。

于是可以简单得到答案。时间复杂度是 \(O(|S_1|+k|\Sigma|)\)

Day1 C

二分答案 \(mid\),设 \(f_u,g_u\) 表示 \(u\) 子树内,满足最长链 \(\le mid\) 的前提下,\(u\to v/v\to u\) 的最长链可能的 min。

转移时可以发现一定是取 \(f\) 排序后的某个前缀或后缀来定向为 \(u\to \text{son}(u)\),其余反着定向。

然后就做完了,瓶颈在给每个点的儿子排序。复杂度 \(O(n\log n\log V)\)

Day1 D

1~3:搜索,记录每个数当前是几倍的 \(a_0\),转移模拟一次操作。

4:由于 \(75497471\equiv 2^{30}\pmod{998244353}\),因此给自己加 \(30\) 遍即可。

5:线段树做区间求和

6:序列分治/猫树

7:前缀和,其中减法改为 \(\times 998244352\),这个可以先算出来 \(a\times (2^{23}+2^{24}+2^{25})\),然后复制一遍得到 \(a\times (2^{23}+2^{24}+2^{25}+2^{27}+2^{28}+2^{29})\),即 \(a\times 998244352\)。这样就只需要 \(32\) 次加法。

8:狄利克雷前缀和,其中 \(a_{8191},a_{8192}\) 需要单独算。由于 \(8191\) 是质数,\(8192=2^{13}\),也容易处理。

9:高维前缀和,FMT 即可。

10:听说只要把过程中 \(a_x=a_y+a_z\) 的操作里,如果 \(a_y,a_z\) 有一个恒为 \(0\) 就改成赋值,就 ac 了。

Day2

可以参考 WC2022 wordle,和那题几乎一样

PKUSC

Day1 A

先考虑长度为奇数的情形,考虑枚举回文中心 \(i\),不妨设它在第一行,我们找到以他为中心的极长回文串 \([l,r]\),那么一个方案一定是选择 \([s,t]\subseteq [l,r]\),然后找到 \((1,s-1)\) 往前和 \((2,t)\) 往后的 LCP。

直接做还得枚举 \(s,t\),但我们注意到取 \([l,r]\) 一定是不劣的,因为如果取了 \(l<s<t<r\),简单讨论可以发现根据字符的对应关系,同样可以构造出取 \([l,r]\) 的解。

于是解的个数就缩小到了 \(O(n)\),只需要求两个位置的 LCP。二分哈希即可。

Day1 B

我的做法是:枚举正方形外面那个框在那里,例如下图中蓝色正方形的框是黑色正方形。

框一共有 \(O(V^3)\) 个,对于一个框,我们相当于要找到距离 \(d\) 满足从这四个顶点出发,位置 \(d\) 恰好都在凸包内。注意这样的 \(d\) 对每条边都是一个区间(因为是凸多边形,一条直线和他相交,在他内部的得到的一定是完整的线段),于是简单处理区间的交即可 \(O(1)\) 计算。

当凸包为直角三角形的时候,只需要枚举右上角,在枚举左下角时需要算的东西形如等差数列求和,可以简单处理,做到 \(O(V^2)\)


听说了一个做法:枚举正方形的形态(形态指的是,某条边的斜率和长度),这只有 \(O(V^2)\) 个。然后相当于要把这个凸包平移四遍求交,得到内部的整点数,是一个类欧的形式,于是可以做到 \(O(nV^2\log V)\)

Day1 C

\(O(nm^2)\) 做法:考虑 DP of DP,原先算最大独立集的 DP 形如记录 \(dp_{u,0/1}\) 表示 \(u\) 选不选的最大独立集。

转移时有 \(dp_{u,0}+\max(dp_{v,0},dp_{v,1})\to dp_{u,0},dp_{u,1}+dp_{v,0}\to dp_{u,1}\)

考虑只记录 \(dp_{u,1}-dp_{u,0}\),那么转移时的一切都可以根据这一项的正负来确定到底在干什么。

具体来说,比如 \(dp_{v,1}-dp_{v,0}<0\),也就是 \(dp_{v,0}>dp_{v,1}\),那么 \(u\) 转移的时候 \(dp_{u,0/1}\) 都会选择 \(dp_{v,0}\) 来转移,于是新的 \(dp_{u,0},dp_{u,1}\) 不变;反之则 \(dp_{u,0}\) 选择 \(dp_{v,1}\) 转移,\(dp_{u,1}\) 选择 \(dp_{v,0}\),那么新的 \(dp_{u,1}-dp_{u,0}\) 就会减掉一个 \(dp_{v,1}-dp_{v,0}\)。于是只需要做一个差卷积的形式。

对于算答案,注意到

\[\max(dp_{u,0},dp_{u,1})=\max(0,dp_{u,1}-dp_{u,0})+dp_{u,0}=\max(0,dp_{u,1}-dp_{u,0})+\sum_{v\in\text{son}(u)}\max(dp_{v,1},dp_{v,0}) \]

如此递归下去,可以得到答案就是 \(\sum_i\max(0,dp_{i,0}-dp_{i,1})\)。于是把贡献拆到每个 \(i\) 上即可算出答案。

进一步,注意到答案是关于 \(m\)\(n+O(1)\) 次多项式,于是做 \(n\) 遍这个 DP,可以得到 \(O(n^4)\) 做法;将转移过程使用 FFT 优化可以做到 \(O(n^3\log n)\)。听说有人使用这个通过了 \(n\le 500\)

更进一步的做法我还不会 orz

Day2 A

考虑直接给 \(1\) 号点操作 \(2^n\) 次,然后递推出 \(f_i\) 表示 \(i\) 被操作的次数,有 \(\frac{1}{2}f_i\to f_{to(i,0)},\frac{1}{2}f_i\to f_{to(i,1)}\),那么我们的要求是所有 \(f_i\) 均为偶数。于是算出最大的 \(k\) 满足 \(\frac{f_i}{2^k}\) 仍然是偶数(这就是找到最低位最低的那个 \(f_i\),他的最低位的位数 \(-1\)),答案就是 \(2^{n-k}\)

注意到我们需要维护 \(2^n\) 级别的数,做他们的加法和除以 \(2\) 两个操作,手写一个 bitset 状物维护即可。

时间复杂度 \(O(\frac{n^2}{w})\),这个题数据好像水了,据说放过了 \(O(n^2)\)

Day2 B

扫描线扫 \(r\),维护 \(a_l\) 表示如果从 \(l\) 开始操作,当前的值是什么。那么每次就是把 \(a_j\in [l_i,r_i],j\in [1,i]\) 的所有 \(a_j\leftarrow a_j+1\)。这个过程可以看做末尾加 \(0\),以及给所有值在 \([l,r]\) 中的数的数值 \(+1\)。可以发现序列始终保持单调不降,于是加的数始终是一个区间。树状数组上二分维护即可。时间复杂度 \(O((n+q)\log n)\),常数很小。

Day2 C

操吴戈兮被犀甲,车错毂兮短兵接。
旌蔽日兮敌若云,矢交坠兮士争先。
凌余阵兮躐余行,左骖殪兮右刃伤。
霾两轮兮絷四马,援玉枹兮击鸣鼓。
天时怼兮威灵怒,严杀尽兮弃原野。
出不入兮往不反,平原忽兮路超远。
带长剑兮挟秦弓,首身离兮心不惩。
诚既勇兮又以武,终刚强兮不可凌。
身既死兮神以灵,魂魄毅兮为鬼雄。


听说了一个做法:考虑询问的时候从两边开始 dij,只保留到他距离最小的 \(\sqrt{n}\) 个点。那么随机的时候,有很大概率,\(s,t\) 这两边距离最小的 \(\sqrt{n}\) 个点的交集就有一个在真正的最短路上。

我其实不太懂这个为啥有道理。。听说有一种解释是说,看成一个圆,然后其面积与半径的平方成正比。感觉这个解释,也很没道理。。

注意每个点的出边个数大约是 \(\frac{m}{n}\),于是这样做的复杂度是 \(O(\frac{qm\log n}{\sqrt{n}}+q\sqrt{n})\)。似乎可以获得 \(70\) 分。

posted @ 2024-05-14 19:24  云浅知处  阅读(1270)  评论(2编辑  收藏  举报