跳转至

"蔚来杯"2022牛客暑期多校训练营8

排名 当场过题数 至今过题数 总题数
24/1294 3 4 12

A

**upsolved by **

题意

题解

B

**upsolved by **

题意

题解

C

**upsolved by **

题意

题解

D

solved by JLK

题意

打牌题。

题解

状压记搜判断胜负即可。需要判断德扑牌型。

E

**upsolved by **

题意

题解

F

solved by JLK

题意

签到,略

题解

在第二个序列里,找每个在第一个序列里相同的位置即可。

G

upsolved by JLK

题意

有排列\(a\)\(p\),一开始\(a_i=p_i=i\)

有一个排列的序列\(A\)\(A_1=a\)\(A_{i,j}=A_{i-1.p_j}\)

\(q\)次操作:

  • 交换\(a_x\)\(a_y\)
  • 交换\(p_x\)\(p_y\)
  • 询问\(A_x\)\(A_y\)哪个字典序大

\(1 \le n,q \le 10^5\)

题解

\(i\rightarrow p_i\)连边,会形成若干个环。\(i\)每增加一次相当于整个环移动一次。

对于\(x,y\),要比较它们的字典序,主要是看环。对于环长能够整除\((x-y)\)的环,显然在\(A_x,A_y\)当中都是相同的,可以直接忽略。

对于不能整除的,实际上只需要考虑下标最小的那个位置,因为比较的是字典序。找到最小的不同的下标,接下来就是要求这个下标在\(x\)\(y\)时间的情况。

如果我们能求出这个下标在\(x\)步之后是原来的哪个下标,就只需要求出下标之后直接读\(a\)数组即可。因此交换\(a_x\)\(a_y\)没什么影响。

也就是说,可以看做\(i\rightarrow p_i\)的连边情况下,走\(x-1\)步到达了哪个点。

考虑维护这个环的形态,交换\(p_x,p_y\)可能导致两个环结合,也可能导致一个环分裂。可以使用平衡树来维护。

具体来说,可以用splay,每个环是一个splay,按顺序存放环(相邻和首尾有边)。splay上维护区间最小下标以及size。

操作的时候需要分类讨论一下。

对于结合,可以把\(p_x,p_y\)分别移动到第一个(把前边的一段移到最后),然后把\(y\)所在整个splay接到\(x\)后面。

对于分裂,可以把\(p_y\)移动到第一个,把\([p_x,y]\)切下来单独成一个splay。

现在可以维护环,那么怎么找环呢?直接大力根号分治,环长小于根号的每个环长存个set,环长大的所有存在一个set里。询问的时候小的枚举环长,大的直接遍历。找到所有环里最小的下标,再到splay里去询问。

\(O(q\log n +q\sqrt n)\)

H

**upsolved by **

题意

题解

I

solved by TYB

题意

给出\(k\)个图\(G\),每个图都是\(n\)个点,给出\(G_1\)\(m\)条边,而对于\(G_i(i>1)\),是从\(G_j(j<i)\)增加或删掉一条边得到的。将这些图按照连通性分成若干个集合,输出每个集合内的元素。两个图连通性相同当且仅当\(\forall i,j\in[1,n]\)\(i,j\)在两个图的连通情况都一样。

\(n,m,k\le10^5\)

题解

建出操作树,每条边的存在区间在dfs序上是连续的若干段,总段数是\(\mathcal{O}(n)\)级别的。所以直接线段树分治解决动态图连通性问题即可。

J

**upsolved by **

题意

题解

K

**upsolved by **

题意

题解

L

**upsolved by **

题意

题解

记录

JLK过F(0:18)和D(1:04)。

TYB会了G,跟JLK讨论后觉得可行,但是太麻烦了先不写。

一起看J,感觉有思路,但是不好写。

然后看I,讨论了一下有点思路,JLK先开始写G。

TYB会了I,开始写I,然后TLE了。

JLK写完G,也是TLE了。

此时YZW说A可以搞,开始搞A,G和I在看代码。

到4:40的时候G和I改了一些错误,I过了(4:41)但G还是TLE。

A最后也搞不动了。

总结

TYB:提高代码能力,一些平常少用的东西也要保持熟练度,比如这次的splay,线段树分治。

Dirt

I(-2)