PKUWC2020游记+题解

有点小难受这次打的。


DAY0

来到了北京有点小冷。
去报到的时候看到了疑似北大集训的讲题现场。
晚上颓废。


DAY1

这一天没有上百,因此我也不说具体分数是多少了。
最主要是我的心路历程。
开场看了一会儿T1没有思路。
看T2很快就会做了,写了一个小时发现过不去样例,非常难受,当时写了一个暴力发现也过不去样例,于是我去求助当时的监考,回答是no response,然而我也很智障,当时只是疯狂检查自己哪里写错了,一直找不出来,结果自闭的一批。同时头也很痛,于是干脆想着打打暴力算了。
于是就打暴力了,T3暴力就那样。
剩下的时间(也没多少时间了)就开干T1,发现数据范围是50,那肯定矩阵乘法啊,很快想出了矩阵乘法的形式,发现并不知道后续的处理,一直在想如何解决交换律之类的东西,感觉自己非常愚蠢,最后也没有想出来。
出来看别人的分数都好高啊,那我打屁啊
zory也爆炸了,也没有上百。
出来之后pb告诉我我概率搞错了,我。。。我tm从来没想过这错了,好吧。
打完之后很难受,在校园里瞎逛了一会儿,去跟师兄们吃饭,吃得很爽。
晚上颓废。


DAY2

早上面试,全程开心聊天,觉得很爽,感觉面试可能没啥用???
中午我们跟wyt,pb,ntf一起吃饭,wyt昨天打得也是暴力,并且他跟我一样也是个二等奖,有点小难受。
下午上机之前我的心态都是随便打打的心态,毕竟我也不年轻了,翻盘感觉也翻不了多少。

进去之后花了两个小时多一点把前两题过了,有点小难受,感觉这种难度多半也翻不了盘了吧,于是抱着娱乐的心态开干T3。
T3想到了最小割树的做法,但当时不知道怎么回事儿,我以为他是 O ( n 2 log ⁡ n ) O(n^2\log n) O(n2logn)的,并且按照我当时的写法这非常难写,我当时脑子疼得都快炸了,实在是没法再写了,跑出去晃悠晃悠了十几二十分钟才回来。
我想这干脆写一个 O ( n 2 log ⁡ 2 n ) O(n^2\log^2n) O(n2log2n)的,一样过部分分完了。
最后也不知道干啥了,开始瞎基尔随机,然而也没什么卵用。。。

出来之后发现大家打得分数都差不多,可能差别跟昨天的差别差不多,感觉自己补回来一点?也没多想,可能又是个二等吧。
zory有点小惨,今天也打得不好。

回酒店又是颓废。


DAY3

上午没事干,非常爽快的在酒店睡觉。
叫名字是真的刺激,特别是看着二等奖一张一张派完的时候。
我跟wyt都挺惊讶的,但是就这样吧,这一等奖也不一定有啥用。


反正体验还是小难受,感觉没有打出真实水平,但也算是不错的教训了,算是积累了一些经验。
写这篇文章的时候正在备战学考呢,因此下面的题解写错了啥多多包含:

PKUWC2020题解

D1T1

我们容易发现 d p dp dp是可以用矩阵来进行转移的。

我们考虑如果我们已经做完了 1 1 1开头的排列,我们怎么做 2 2 2开头的排列,我们容易发现这是一个变换,他相当于 2 2 2号节点变成了 1 1 1号节点, 1 1 1号节点变成了 1 1 1号节点,那么我们只需要做行和列的交换即可。

那么剩下的过程就类似于一个数位 d p dp dp

D1T2

可以考虑计算一个集合的贡献。

考虑这个概率是什么东西,我们可以发现,一个大小的集合出现的概率之和它的大小和分成多少个集合有关,那么我们考虑计算出 f i f_i fi为大小为 i i i的集合的贡献之和。

这个东西的计算是平凡的,我们可以考虑把式子拆成 max ⁡ 2 − 2 max ⁡ min ⁡ + min ⁡ 2 \max^2-2\max\min+\min^2 max22maxmin+min2来算,这些东西大概都是可以用卷积来优化的。

我们考虑设 g ( i , k ) g(i,k) g(i,k)为大小为 i i i的集合,合成了 k k k次的出现的概率。

则容易发现这其实是一个组合数的过程:

式子大概就是你按照题目的定义写出一堆 ( n 2 ) {n\choose 2} (2n)相乘的结果,假设一共有 n n n个数:
g ( s , k ) = ∏ i = 2 s ( i 2 ) ∏ i = n − k + 1 n − s ( i 2 ) ( k s − 1 ) ∏ i = 2 n ( i 2 ) = s ! ( s − 1 ) ! ( n − s ) ! ( n − s − 1 ) ! ( n − k ) ! ( n − k − 1 ) ! k ! ( s − 1 ) ! ( k − s + 1 ) ! n ! ( n − 1 ) ! = s ! ( n − s ) ! ( n − s − 1 ) ! ( n − k ) ! ( n − k − 1 ) ! k ! ( k − s + 1 ) ! n ! ( n − 1 ) ! \begin{aligned}g(s,k)&=\frac {\prod_{i=2}^s{i\choose 2}\prod_{i=n-k+1}^{n-s}{i\choose 2}{k\choose s-1}}{\prod_{i=2}^n{i\choose 2}}\\&=\frac {s!(s-1)!\frac {(n-s)!(n-s-1)!}{(n-k)!(n-k-1)!}\frac {k!}{(s-1)!(k-s+1)!}}{n!(n-1)!}\\&=\frac {s!\frac {(n-s)!(n-s-1)!}{(n-k)!(n-k-1)!}\frac {k!}{(k-s+1)!}}{n!(n-1)!}\end{aligned} g(s,k)=i=2n(2i)i=2s(2i)i=nk+1ns(2i)(s1k)=n!(n1)!s!(s1)!(nk)!(nk1)!(ns)!(ns1)!(s1)!(ks+1)!k!=n!(n1)!s!(nk)!(nk1)!(ns)!(ns1)!(ks+1)!k!
大概是这样,我也不知道对不对。

那么我们考虑答案是让你计算 h ( i ) h(i) h(i)表示合成了 n − i + 1 n-i+1 ni+1次的结果。

那么:
h ( k ) = ∑ i = 1 n f i g ( i , n − k + 1 ) \begin{aligned}h(k)&=\sum_{i=1}^{^n}f_ig(i,n-k+1)\\\end{aligned} h(k)=i=1nfig(i,nk+1)
你如果把上面的那些东西照搬下来你可以发现可以写出之和 k k k相关的,之和 i i i相关的,之和 i − k i-k ik相关的,因此可以卷积。

D1T3

我们考虑把答案的贡献式写出来,设当前询问是 l , r , x l,r,x l,r,x,设 p p i = max ⁡ ( 0 , min ⁡ ( r i , r ) − max ⁡ ( l i , l ) + 1 ) pp_i=\max(0,\min(r_i,r)-\max(l_i,l)+1) ppi=max(0,min(ri,r)max(li,l)+1)

假设一个修改是 l i , r i , x i , v i l_i,r_i,x_i,v_i li,ri,xi,vi这样的:
a n s = ∑ i = 1 q p p i v i ∑ j = 1 n [ gcd ⁡ ( x , j ) = 1 ] [ gcd ⁡ ( x i , j ) = 1 ] = ∑ i = 1 q p p i v i ∑ j = 1 n ∑ d 1 ∣ x , d 1 ∣ j μ ( d 1 ) ∑ d 2 ∣ x i , d 2 ∣ j μ ( d 2 ) = ∑ i = 1 q p p i v i ∑ d 1 ∣ x μ ( d 1 ) ∑ d 2 ∣ x i μ ( d 2 ) n l c m ( d 1 , d 2 ) \begin{aligned}ans&=\sum_{i=1}^qpp_iv_i\sum_{j=1}^n[\gcd(x,j)=1][\gcd(x_i,j)=1]\\&=\sum_{i=1}^qpp_iv_i\sum_{j=1}^n\sum_{d_1|x,d_1|j}\mu(d_1)\sum_{d_2|x_i,d_2|j}\mu(d_2)\\&=\sum_{i=1}^qpp_iv_i\sum_{d_1|x}\mu(d_1)\sum_{d_2|x_i}\mu(d_2)\frac {n}{\mathrm{lcm}(d_1,d_2)}\\\end{aligned} ans=i=1qppivij=1n[gcd(x,j)=1][gcd(xi,j)=1]=i=1qppivij=1nd1x,d1jμ(d1)d2xi,d2jμ(d2)=i=1qppivid1xμ(d1)d2xiμ(d2)lcm(d1,d2)n
考虑枚举 D = gcd ⁡ ( d 1 , d 2 ) D=\gcd(d_1,d_2) D=gcd(d1,d2),那么,我们令 C d C_d Cd表示修改中满足 d ∣ x d|x dx的式子,令 Q d Q_d Qd为询问中满足的式子,设:

o l ( l 1 , r 1 , l 2 , r 2 ) = max ⁡ ( 0 , min ⁡ ( r 1 , r 2 ) − max ⁡ ( l 1 , l 2 ) + 1 ) ol(l_1,r_1,l_2,r_2)=\max(0,\min(r_1,r_2)-\max(l_1,l_2)+1) ol(l1,r1,l2,r2)=max(0,min(r1,r2)max(l1,l2)+1),则:
a n s = ∑ D = 1 n ∑ d 1 = 1 ⌊ n D ⌋ μ ( d 1 D ) ∑ d 2 = 1 ⌊ n D ⌋ μ ( d 2 D ) [ gcd ⁡ ( d 1 , d 2 ) = 1 ] ⌊ n d 1 D d 2 D ⌋ ∑ i ∈ C d 1 D ∑ j ∈ A d 2 D o l ( l i , r i , l j , r j ) x i = ∑ D = 1 n ∑ d 1 = 1 ⌊ n D ⌋ μ ( d 1 D ) ∑ d 2 = 1 ⌊ n D ⌋ μ ( d 2 D ) ∑ d ∣ d 1 , d ∣ d 2 μ ( d ) ⌊ n d 1 D d 2 D ⌋ ∑ i ∈ C d 1 D ∑ j ∈ A d 2 D o l ( l i , r i , l j , r j ) x i \begin{aligned}ans&=\sum_{D=1}^n\sum_{d_1=1}^{\lfloor\frac nD\rfloor}\mu(d_1D)\sum_{d_2=1}^{\lfloor\frac nD\rfloor}\mu(d_2D)[\gcd(d_1,d_2)=1]\lfloor\frac n{d_1Dd_2D}\rfloor\sum_{i\in C_{d_1D}}\sum_{j\in A_{d_2D}}ol(l_i,r_i,l_j,r_j)x_i\\&=\sum_{D=1}^n\sum_{d_1=1}^{\lfloor\frac nD\rfloor}\mu(d_1D)\sum_{d_2=1}^{\lfloor\frac nD\rfloor}\mu(d_2D)\sum_{d|d_1,d|d_2}\mu(d)\lfloor\frac n{d_1Dd_2D}\rfloor\sum_{i\in C_{d_1D}}\sum_{j\in A_{d_2D}}ol(l_i,r_i,l_j,r_j)x_i\\\end{aligned} ans=D=1nd1=1Dnμ(d1D)d2=1Dnμ(d2D)[gcd(d1,d2)=1]d1Dd2DniCd1DjAd2Dol(li,ri,lj,rj)xi=D=1nd1=1Dnμ(d1D)d2=1Dnμ(d2D)dd1,dd2μ(d)d1Dd2DniCd1DjAd2Dol(li,ri,lj,rj)xi
我们考虑枚举 D d Dd Dd
a n s = ∑ D = 1 n ∑ d ∣ D μ ( d ) ∑ d 1 = 1 ⌊ n D ⌋ μ ( d 1 D ) ∑ d 2 = 1 ⌊ n D ⌋ μ ( d 2 D ) ⌊ n d 1 d 2 D d ⌋ ∑ i ∈ C d 1 D ∑ j ∈ A d 2 D o l ( l i , r i , l j , r j ) x i \begin{aligned}ans&=\sum_{D=1}^n\sum_{d|D}\mu(d)\sum_{d_1=1}^{\lfloor\frac nD\rfloor}\mu(d_1D)\sum_{d_2=1}^{\lfloor\frac nD\rfloor}\mu(d_2D)\lfloor\frac n{d_1d_2Dd}\rfloor\sum_{i\in C_{d_1D}}\sum_{j\in A_{d_2D}}ol(l_i,r_i,l_j,r_j)x_i\end{aligned} ans=D=1ndDμ(d)d1=1Dnμ(d1D)d2=1Dnμ(d2D)d1d2DdniCd1DjAd2Dol(li,ri,lj,rj)xi
则我们最外层枚举一个 D D D,然后考虑对于每个 D D D单独做:

则先考虑修改,我们考虑这样子做,对于枚举 D , d , d 1 D,d,d_1 D,d,d1,我们把 ⌊ n d 1 d D ⌋ \lfloor \frac n{d_1dD}\rfloor d1dDn这一行区间加,那么我们考虑复杂度计算:
∑ D = 1 n ∑ d ∣ D ∑ d 1 = 1 ⌊ n D ⌋ n d 1 D = ∑ D = 1 n ∑ d ∣ D n D log ⁡ n = ∑ d = 1 n ∑ D = 1 ⌊ n d ⌋ n D d log ⁡ n = ∑ d = 1 n n d log ⁡ 2 n = n log ⁡ 3 n \begin{aligned}&\sum_{D=1}^n\sum_{d|D}\sum_{d_1=1}^{\lfloor\frac nD\rfloor}\frac n{d_1D}=\sum_{D=1}^n\sum_{d|D}\frac nD\log n\\=&\sum_{d=1}^n\sum_{D=1}^{\lfloor\frac nd\rfloor}\frac n{Dd}\log n=\sum_{d=1}^n\frac nd\log^2n\\=&n\log^3n\end{aligned} ==D=1ndDd1=1Dnd1Dn=D=1ndDDnlognd=1nD=1dnDdnlogn=d=1ndnlog2nnlog3n
我们考虑这个东西我们做一个前缀和,但在那之前我们可以离散化一波,容易发现,我们只有 C D , Q D C_D,Q_D CD,QD中的列是有用的,而这个东西的大小大概是 O ( n D ) O(\frac nD) O(Dn)的,行的数量大概是 n D \frac nD Dn那么我们预处理的复杂度就是:
∑ D = 1 n n D log ⁡ n = O ( n log ⁡ 2 n ) \sum_{D=1}^n\frac nD\log n=O(n\log^2n) D=1nDnlogn=O(nlog2n)
做一遍二维前缀和复杂度为:
∑ D = 1 n ( n D ) 1.5 ≈ n 1.5 ∫ 0 n ( 1 t ) 1.5 d t = O ( n n ) \sum_{D=1}^n(\frac nD)^{1.5}\approx n^{1.5}\int_0^n(\frac 1t)^{1.5}dt=O(n\sqrt n) D=1n(Dn)1.5n1.50n(t1)1.5dt=O(nn )
然后你枚举 d , D , d 2 d,D,d_2 d,D,d2,然而这里跟上面不太一样的是我们还要枚举一个行,我们注意到第 i i i行的贡献是 ⌊ i d 2 ⌋ \lfloor\frac i{d_2}\rfloor d2i,则我们可以考虑枚举 ⌊ i d 2 ⌋ \lfloor \frac i{d_2}\rfloor d2i,由于 i i i ⌊ n d 1 D d ⌋ \lfloor\frac n{d_1Dd}\rfloor d1Ddn这样的形式,于是肯定可以写成: ⌊ n D d 1 ⌋ x \frac {\lfloor \frac n{Dd_1}\rfloor}{x} xDd1n的形式,于是只有 O ( ⌊ n D d 1 ⌋ ) O(\sqrt {\lfloor\frac n{Dd_1}\rfloor}) O(Dd1n )段,那么每一段都是一个矩阵和,由于此时已经不含 d d d了,则复杂度是:
∑ D = 1 n ∑ d 1 = 1 ⌊ n D ⌋ ( n d 1 D ) 1.5 ≈ n 1.5 ∑ D = 1 n ( 1 D ) 1.5 ≈ n 1.5 \sum_{D=1}^n\sum_{d_1=1}^{\lfloor \frac nD\rfloor}(\frac n{d_1D})^{1.5}\approx n^{1.5}\sum_{D=1}^n(\frac 1D)^{1.5}\approx n^{1.5} D=1nd1=1Dn(d1Dn)1.5n1.5D=1n(D1)1.5n1.5
至此问题在 O ( n log ⁡ 3 n + n n ) O(n\log^3n+n\sqrt n) O(nlog3n+nn )的时间内解决。

D2T1

我们考虑维护一个 A , B , S A,B,S A,B,S表示前面有 A A A个毒鱼没有使用,有 S S S对配对的小于和毒鱼,有 B B B个小鱼还剩下,那么做一个前缀和就完事了,剩下的部分是简单贪心。

D2T2

我们考虑笛卡尔树维护,我们把询问挂在区间最大值上面,那么我们需要维护两个线段树,一个线段树表示左端点到某个节点的值,一个线段树表示右端点到某个节点的值,那么我们需要一个区间乘法就完了。

D2T3

考虑最小割树,最小割树的过程大概就是做 O ( n ) O(n) O(n)次网络流就把图建出来,过程如下:

一开始找到两个点 u , v u,v u,v,设他们之间的最小割为 c u t ( u , v ) cut(u,v) cut(u,v),我们把属于 u u u的放在一起设为 U U U,属于 v v v的放在一起,设为 V V V,则有引理对于任意 x ∈ U , y ∈ V x\in U,y\in V xU,yV满足 c u t ( x , y ) ≤ c u t ( u , v ) cut(x,y)\le cut(u,v) cut(x,y)cut(u,v)

反证:假设有 c u t ( x , y ) > c u t ( u , v ) cut(x,y)>cut(u,v) cut(x,y)>cut(u,v)那么就不能把 u , v u,v u,v割开,因为 x , y x,y x,y相连。

那么我们分成集合 U U U和集合 V V V递归去做,这样子最后就建成了一个树形结构,两点之间的最小割就是两点路径上的最小值。

那么有了这个东西,现在题目的要求相当于变成了,让你 O ( n ) O(n) O(n)求最小割。

我们考虑断开两条边的贡献,那么断开后形成的两个集合之间必须没有边相连,那么每条边实际上就可以贡献 O ( 1 ) O(1) O(1)个矩阵,做一个二维前缀和就可以算出断开两条边的贡献。

那么我们观察两个点之间可用的边对是哪些,容易发现他长成这样:
在这里插入图片描述

做一个行的前缀 min ⁡ \min min,列的后缀 min ⁡ \min min,然后暴力枚举行或列即可。

那么时间复杂度是 O ( n 2 ) O(n^2) O(n2),据说可以更快变成 O ( n n log ⁡ n ) O(n\sqrt n\log n) O(nn logn)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值