19年举办的THUWC2020(aka THUWC2019-2)题意回忆+部分口胡题解

由于博主很菜,不保证回忆准确无误。

D1T1

题意:

你有一个长度为 k ( k ≤ 20 ) k(k\leq 20) k(k20) 的序列,有 n ( n ≤ 1 e 5 ) n(n\leq 1e5) n(n1e5) 次操作,每次操作会给你一个长度为 k k k 的序列 b b b 和一个位置 p p p ,假设你当前手里序列是 a a a,如果 b p > a p b_p > a_p bp>ap 就会将 a a a 序列整个替换成 b b b

操作序列在初始时告诉你且不会修改。

现在有 q ( q ≤ 1 e 5 ) q(q\leq 1e5) q(q1e5) 次询问,每次给出初始序列 a a a ,问在执行了操作序列中的操作之后的最终序列长什么样子。

时限 3 s 3s 3s

口胡:

签到题,由于替换是整个操作,我们处理出原序列被替换成了某个序列的答案,然后对于询问,找到第一次替换发生的位置即可。

预处理直接倒着来就行了。注意我们需要维护前缀最大值,要开一个单调栈。

D1T2

题意:

给你一个有向图 G = { V , E } , ( ∣ V ∣ ≤ 1 e 5 , ∣ E ∣ ≤ 1.5 e 5 ) G=\{V,E\},(|V| \leq 1e5,|E| \leq 1.5e5) G={V,E},(V1e5,E1.5e5) ,每条边有经过次数的限制。

q ( q ≤ 3 e 5 ) q(q\leq 3e5) q(q3e5)次询问(但是我看ouuan说是 q ≤ 1 e 5 q\leq 1e5 q1e5?),每次给一个初始位置 u u u 和步数限制 s s s,按照如下规则进行游走:

  1. 如果当前点没有可以走的出边或者已经达到步数限制,结束。
  2. 否则选择所有出边中编号最小的,走过去。

游走是具有后效性的,即每条边被经过的次数在全局进行统计,而不会在每个询问后进行重置

时限 8 s 8s 8s

口胡:

这道题算是救了我一命,幸好这道题调出来了,不然我可能就真的凉了。

把每个点的当前选择的出边拎出来,显然是一个基环树森林。

直接LCT维护基环树森林,对于询问大力分类讨论就行了。

一个小时能A的我请你嚯冰阔落

D1T3

题意:

现在网上找得到的题意都是已经转化过的,我来口胡一个隐约记得的未转化的题意。

给一棵大小为 n ( n ≤ 3 e 5 ) n(n\leq 3e5) n(n3e5) 树,定义 d i s ( u , v ) dis(u,v) dis(u,v) 为两点树上路径需要经过的边数。

q ( q ≤ 6 e 5 ) q(q\leq 6e5) q(q6e5)次询问,每次给一个区间 [ l , r ] [l,r] [l,r],问标号在 [ l , r ] [l,r] [l,r] 的点集 S S S 有多少个子集满足是 X − 连 通 X-连通 X 的,( X X X 是一个开始就给好了的变量)

定义两个点 u , v u,v u,v X − 关 联 X-关联 X 的,当且仅当以下条件成立:

  1. 存在一个点的序列 p p p,长度为 t t t,使得 p 1 = u , p t = v p_1=u,p_t=v p1=u,pt=v
  2. 对于 1 ≤ i < t 1\leq i < t 1i<t d i s ( p i , p i + 1 ) ≤ X dis(p_i,p_{i+1})\leq X dis(pi,pi+1)X
  3. 对于 1 ≤ i ≤ t 1\leq i\leq t 1it l ≤ p i ≤ r l\leq p_i \leq r lpir

定义一个点集 V ⊆ S V\subseteq S VS X − 连 通 X-连通 X 的,当且仅当以下条件成立:

  1. 对于任意 u , v ∈ V u,v\in V u,vV u , v u,v u,v X − 关 联 X-关联 X 的。
  2. 对于任意 u ∈ V , v ∈ S / V u\in V,v\in S/V uV,vS/V u , v u,v u,v 不是 X − 关 联 X-关联 X 的。

时限 6 s 6s 6s

题解:

容易发现就是要把距离不超过 X X X 的点连边,然后求 [ l , r ] [l,r] [l,r] 的导出子图连通块个数,转化题意用不了多少时间。

我现在也不会,放一个神仙发在UOJ群里的题解

在这里插入图片描述

D2T1

题意:

你有一个初始值 s ( ∣ s ∣ ≤ 15 ) s(|s|\leq 15) s(s15),和 n ( n ≤ 15 ) n(n\leq 15) n(n15) 次变换操作,第 i i i次操作形如 s = a i ∣ s ∣ + b i ⋅ s + c i s=a_i |s|+b_i \cdot s+c_i s=ais+bis+ci

请你调整操作的顺序,最大化最终 s s s 的值。

∣ a ∣ , ∣ b ∣ , ∣ c ∣ ≤ 15 |a|,|b|,|c|\leq 15 a,b,c15,时限 1 s 1s 1s

口胡:

听说很多错误做法能过pp。。。

一个比较naive的想法是维护最大最小值,大于 0 0 0的最小值和小于0的最大值。

最大最小值就可以维护了,但是后面两个东西目前仍然有点尴尬。

注意到 s s s实际上变成了 ( a + b ) s + c (a+b)s+c (a+b)s+c 或者 ( b − a ) s + c (b-a)s+c (ba)s+c,也就是 k s + c ks+c ks+c 的形式。

k = 0 k=0 k=0的情况直接判掉不管,否则 ∣ k s ∣ |ks| ks 的值相对于 s s s 总是不减的,后面一个 c c c 最多导致绝对值变化 15 15 15

维护 − 225 -225 225 225 225 225 的可达性即可。

复杂度视实现从 O ( 2 n ∑ c ) O(2^n\sum c) O(2nc) O ( 2 n n ∑ c ) O(2^nn\sum c) O(2nnc) ,不过由于根本卡不满所以能过。

D2T2

题意:

给一张 D A G DAG DAG G = { V , E } ( ∣ V ∣ ≤ 1 e 5 , ∣ E ∣ ≤ 1.5 e 5 ) G=\{V,E\}(|V|\leq 1e5,|E|\leq 1.5e5) G={V,E}(V1e5,E1.5e5),令 T T T G G G D F S DFS DFS 树(优先 D F S DFS DFS 编号小的节点)。 q q q 次询问 ( q ≤ 1 e 5 ) (q\leq 1e5) (q1e5) ,每次给两个点 u , v u,v u,v,保证 u u u v v v 的祖先,请你回答在删掉 u , v u,v u,v 树上路径的所有边之后,有多少点无法从 1 1 1 号点到达。

时限 1 s 1s 1s

口胡

一个比较显然的想法是对于每个点 u u u ,求出最高的一个祖先 f u f_u fu,使得 f u f_u fu 能够不经过 < u , f u > <u,f_u> <u,fu> 树上路径上的边到达 u u u

先考虑在知道 f u f_u fu 之后怎么处理询问,对于点 u u u ,在 f u f_u fu 处我们就可以将 [ i n [ u ] , o u t [ u ] ] [in[u],out[u]] [in[u],out[u]] 标记为可达。那么询问 ( a , b ) (a,b) (a,b) 的时候我们需要的就是 a a a 到根的合法区间的并在 [ i n [ b ] , o u t [ b ] ] [in[b],out[b]] [in[b],out[b]] 中有多少元素。

可持久化线段树即可。

回到开头,怎么求 f u f_u fu

下来想了半天总算想明白了,类似半支配点的求法,按照DFS序倒着处理,对于 u u u,我们枚举除了父亲以外所有能够到 u u u的点,很容易注意到我们要求的就是这些点在反图中不经过 u u u的任何祖先边,能够到达的最高的 u u u的祖先,直接带权并查集维护一下就行了。(和求半支配点唯一的区别就是不能考虑父亲)

MD这才是D2签到题,我真TM是个铁憨憨

D2T3

给一棵树 ( n ≤ 5 e 5 ) (n\leq 5e5) (n5e5),不修改,有 q ( q ≤ 5 e 5 ) q(q\leq 5e5) q(q5e5) 次询问,每次给一条有向路径和一个数 k k k ,询问把路径上的点的序列拿出来,求有多少个序列在经历了 k k k 轮冒泡排序后得到该序列。

时限 4 s 4s 4s

不会

翻到一篇题解,还没看:here

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值