logo

yaohaoyou

春节

CSP2025 油机

2025-11-18 Views 游记1903字9 min read

省流:自己看完。

Day 0

甚至要到了体锻,但是不出所料,上高一后就很少人踢球了,爽但不太爽。

听到学弟问要不要背快读模板,感觉根本背不下来,而且大概也没用吧(伏笔

Day 1

终于不用早起了,但是还是睡到 8:00 就不想睡了。早上在复习板子,被教练看见了,于是就有了:

伏笔)

中午看了 J 的题目,为什么我不参加就这么简单,学长 AK 后玩 Ukraine 方块被抓包了?

中午直接睡到 14:10 才起来(为什么我的闹钟没响?)。问监考能不能带水杯进去,他说:《喝一口就行》,所以是怕我带炸药进考场???

密码输的最快的一次,开 T1,然后回了,但怎么有点像反悔贪心?写写写,本地跑 1s+?为什么 5×1055\times10^5 个整数不给快读?把堆改成排序就更快了,现在是真怕 T1/T2 被卡常。

开 T2,直接保留最小生成树做就行了,先写了 O(n2klognα(n))\mathcal O(n2^k\log n\alpha(n)),要跑 1.6s。为什么 3×106,1s3\times 10^6,1s 都不下发快读???CCF 不会默认大家都会 fread 吧。再看一下归并可以少一只 log,写写写,为什么少一只 log 还要跑 1s?丢了。

开 T3,感觉不太会做,推了一下性质发现只要会快速做两个有多少个 xiA,yiBx_i\in A,y_i\in B 即可,但这很明显不能快速做吧。然后就开始乱想了,中途甚至会根号分治做 O(Ln)\mathcal O(L\sqrt n),但是为什么这和 O(Ln)\mathcal O(Ln) 一个分???计算后发现 O(nL)\mathcal O(n\sqrt L) 可以过,然后就磕了一场的根号,然后就寄了。AB 性质一共打了 7kb+,考场直接被调红温了。

T4 提前看了,排列计数一看就不会做,最后 15min 极限拿下 24pts。虚拟机过编后都来不及测大样例就结束了。(为什么 14:30 发的密码监考员说 14:27 就开始了,一定要 18:27 结束,CCF 是差 3min 赶晚高峰吗???)

赛后遇见 yhm 问 zlt 2h 有没有 AK,直接自闭了。mlk 觉得自己好帅,然后就 AK 了。

估分:100+100+70+24=294100+100+70+24=294

Day 5

T3 没判 t1t2|t_1|\ne |t_2|,自闭了。

申诉查分???

100+100+50+24=274100+100+50+24=274

Day 6

T3 t1t2|t_1|\ne |t_2| 没被卡,但是 maxl\operatorname{maxl} 开成 maxn\operatorname{maxn} 了,坠。

原来 T3 放到两棵 Trie 上就从 xiA,yiBx_i \in A,y_i \in B 变成 xi[l1,r1],yi[l2,r2]x_i\in [l_1,r_1],y_i\in [l_2,r_2],就可以二维数点了,这么笨可以滚了。

无敌坦克手贝塔获得成就:max(CSP-S 2025)min(CSP-S 2025)=3\max(\text{CSP-S 2025})-\min(\text{CSP-S 2025})=3

replace 题解:

手玩一下可以证明,将 (si,1,si,2)(s_{i,1},s_{i,2}) 定义成 (ai,bi,bi,ci)(a_i,b_i,b'_i,c_i),其中 aia_iLCP(si,1,si,2)LCP(s_{i,1},s_{i,2})cic_iLCS(si,1,si,2)LCS(s_{i,1},s_{i,2})ai+bi+ci=si,1,ai+bi+ci=si,2a_i+b_i+c_i=s_{i,1},a_i+b'_i+c_i=s_{i,2},同理将 (ti,1,ti,2)(t_{i,1},t_{i,2}) 定义成 (Ai,Bi,Bi,Ci)(A_i,B_i,B'_i,C_i),则能将 tj,1t_{j,1} 通过 (si,1,si,2)(s_{i,1},s_{i,2}) 替换成 tj,2t_{j,2} 当且仅当 aia_iAjA_j 的后缀,bi=Bj,bi=Bjb_i=B_j,b'_i=B'_jcic_iCjC_j 的前缀。

bi=Bj,bi=Bjb_i=B_j,b'_i=B'_j 的限制好做,直接将所有 (bi,bi)(b_i,b'_i) 哈希后存在一起,查询时找到对应的集合即可。剩下两个限制不能直接做,前缀后缀可以考虑建出两棵 Trie 树,限制就变为了求有多少个位置在第一棵 Trie 上一个子树内,在第二棵 Trie 上为当前点的祖先,然后使用 dfs 序即可转成二维数点,在第二棵 Trie 上 dfs,用树状数组记录第一棵的区间点数。时间复杂度为 O(L1+L2+(n+q)logn)\mathcal O(L1+L2+(n+q)\log n),空间 O((L1+L2))\mathcal O((L1+L2)|\sum|).

employ 题解:

对排列计数肯定不能直接做,先记录 fi,jf_{i,j} 表示面试了 ii 个人有 jj 个人没有录用的方案数,则目前的人可以分成 cijc_i\le jci>jc_i>j 的人,尝试直接记录在状态内。重设状态 fi,j,kf_{i,j,k} 表示面试了 ii 个人有 jj 个没有录用,cp>jc_p>j 的共有 kk 个人的方案数(cp>jc_p>j 的无需记录位置和具体取的值,即延后钦定,这里后面会解释)。

si+1=0s_{i+1}=0,此时的 jj+1j\gets j+1kk 会减去前面选中的 c=j+1c=j+1 的个数,这里考虑直接枚举 ll 表示前面的人中有 llcp=j+1c_p=j+1。这里就解释了为什么要延后钦定,因为如果直接在加入时就选择他的位置和值,现在就会算重和算错。这里需要给 ll 个人钦定位置和值,所以乘上 (cntj+1l)(kl)l!\binom{cnt_{j+1}}{l}\binom{k}{l}l! 的系数,转移如下:

{fi+1,j+1,kl+1fi,j,k(cntj+1l)(kl)l!当前 i+1 选择 c>j+1fi+1,j+1,klfi,j,k(cntj+1l)(kl)l!(prej+1i+kl)当前 i+1 选择 cj+1\begin{cases} f_{i+1,j+1,k-l+1}\gets f_{i,j,k}\binom{cnt_{j+1}}{l}\binom{k}{l}l! & \text{当前 }i+1\text{ 选择 } c>j+1\\ f_{i+1,j+1,k-l} \gets f_{i,j,k}\binom{cnt_{j+1}}{l}\binom{k}{l}l!(pre_{j+1}-i+k-l) & \text{当前 }i+1\text{ 选择 }c\le j+1 \end{cases}

然后 si+1=1s_{i+1}=1 的就类似了,注意若选择的 c>jc>j' 时不用记录当前选数的方案数。

{fi+1,j,k+1fi,j,k当前 i+1 选择 c>jfi+1,j,k+1fi,j,k(cntj+1l)(kl)l!(preji+k)当前 i+1 选择 cj\begin{cases} f_{i+1,j,k+1} \gets f_{i,j,k} & \text{当前 } i+1 \text{ 选择 } c>j \\ f_{i+1,j,k+1} \gets f_{i,j,k}\binom{cnt_{j+1}}{l}\binom{k}{l}l!(pre_j-i+k) & \text{当前 } i+1 \text{ 选择 } c\le j \end{cases}

最后记得求答案时需要给剩余的选定位置和值:

ans=i=0nmfn,i,nprei(nprei)!ans=\sum_{i=0}^{n-m}f_{n,i,n-pre_i}(n-pre_i)!

EOF