THUWC2019 场外游记

又开始了冬令营时间。
由于今年THUWC和NOIWC都在我校举办,于是并不需要出去住。但我也不打算住在学校,每天晚上都滚回家。

Day1

早上来到学校,貌似到的很晚(?)。报到完后领了胸牌和衣服,就去吃饭了,饭菜比平常的好多了。
吃完饭回宿舍休息一下,被抓去合影,自信不穿发的衣服。旁边有一个yww红太阳,后面传来“一时膜yww一时爽,一直膜yww一直爽”的声音。
然后就比赛了,毕竟是第四次来,作为场外选手,感觉心态好多了(flag)。
看题。
T1是个期望?冷静一下,发现是假的,实际上是问 i = l 1 r 1 j = l 2 r 2 [ A i = B j ] \sum_{i=l1}^{r1} \sum_{j=l2}^{r2} [A_i=B_j] ,莫队板子题。害怕推炸了,先写个暴力验下。一交不要紧,吓了一跳,我的程序一直评不出来,好不容易跑完了一个点又重测了。赶快把工作人员叫来,0.5h后才修好锅。赶紧写了发莫队。莫队复杂度是啥来的?就设个块大小 2 q 2* \sqrt{q} 吧。交上去不明80,自闭了。
那开波T3吧,毕竟是个把“容斥”告诉你的题目。冷静推了一波,发现很sb。然后就写了,调了一会就pp了。
还有2h,开T2。然后瞎推了一波,搞到快考试结束也只有39.6分。放弃治疗,回去调T1,信仰了一波 0.1 q 0.1*\sqrt{q} ,然后。。它就pp了???(场后算了一下最优块大小应该是25,这个版本是100,原来的2000差的太远了)。这时候得分239.6,感觉稳了。吃了块巧克力等结束。
出来后一问,我貌似很高?dcx225,zjt和sk200,yww貌似炸了,只有170。并不敢问正式选手的分。
晚上开幕式听dyh讲话,被dcx狂D不止。见到了lk,又认识了初一cf红名的神仙djq_cpp,感觉被他们艹爆了。
回家路上比较开心,又听说zzy275,感觉自己还是要学习一个。

Day2

第二天早上被早早拉起来,赶到现场就开考了,感觉有点困。
开场看T1,一开始以为是cf某闵可夫斯基和+边分治题的改版,结果冷静了一下发现是tg题,感觉thuwc不可能那么sb,于是上个厕所冷静一下,结果光排队就花了10min。整场比赛浪费了大量时间在上厕所排队上。
1h后才把T1pp,赶紧开了T2,交互题?想了一会大概会了用 O ( n ) O(n) 次1和2操作,或者用 O ( n 2 ) O(n^2) 次1操作的做法。觉得正解是二分,yy了一个做法,感觉是对的,写完一测样例是假的,怒改暴力,只有70分。
只剩2h,开了T3,感觉是一个我见过的题改版,不过一眼看过去只会 O ( n 4 ) O(n^4) ,于是先写了两种sb暴力,还剩40min时有了51分。
这时我冷静一下,发现 O ( n 4 ) O(n^4) 算法转移时按斜率排个序,就可以前/后缀和了,感觉很稳(flag)。不顾只剩40min的事实,尝试rush正解。最后一分种调过了小样例,交了。一测大样例,凉了。赶紧想交原来的程序,到最后也没交上去,于是丢了51分。
考试结束时心态崩了,大吼大叫,还被工作人员警告了。
出来一问,是个人都有200+,yww270直接翻盘。因为自己的神仙操作把自己送走了,直接自闭了。

Day2s

没啥好说的,100分滚粗。
zjt220,yww170 tql!

Day3

本来不想这么早出门的,结果还是想看一下我校的情况。
到了激动人心的念名单时刻,我校7人喜进面试,高二2人,高一2人,初中3人,应该有至少一半一等吧(flag)。ckw三场490+稳得不行,他妈妈中午没发约就说请客,被吓傻了,并不敢去。oyyp前两场都200+,也稳得很。
下午听了几个小时吹水,终于到发约了。今年由于政策原因,改发奖了。结果傻眼了,2个二等(省队最优惠政策),5个三等(夏令营再来一次)。听说xj7个一等,不知说啥好。还是要恭喜dtz和dyh喜获二等(在我校等于无条件最优惠政策)。
晚上被ckw妈拉去庆祝。dtz虽然签了二等,但貌似被政策搞得心情不太好。

总结

只说OI赛制的前两天吧,如果不是最后的失误,还是分数可观的(应该不可能再在考试最后时刻犯傻了吧(flag))。但听说fls两场都阿克了,感觉可能不在一个水平线上。
又听说炸了51分也够得上一等奖的分数线,还是有点惊讶的。不管怎么说,第四次来清华营,总算够得上无条件(一等)的线了,算是了却了一个念想。遥想thusc2017面试不进,thuwc2018 Day2 15+10,感觉自己经历了很多,也算是一个不错的结果吧(不知道还会不会再来玩)。
硬要马后炮的话,就是没有吸取考试最后时刻要冷静检查的教训吧。

题解

Day1T1

题意

有两个长度为 n n 的序列 A , B A,B ,每次给出 l 1 , r 1 , l 2 , r 2 ( r 1 l 1 + 1 r 2 l 2 + 1 ) l1,r1,l2,r2(r1-l1+1\leq r2-l2+1) ,询问若 A [ l 1 , r 1 ] A[l1,r1] B [ l 2 , r 2 ] B[l2,r2] 随机匹配,匹配的两个数相等的对数的期望。
n 50000 , q 1000000 n\leq 50000,q\leq 1000000

解法

i = l 1 r 1 j = l 2 r 2 [ A i = B j ] \sum_{i=l1}^{r1} \sum_{j=l2}^{r2} [A_i=B_j] 可以分成四个形如 i = 1 r 1 j = 1 r 2 [ A i = B j ] \sum_{i=1}^{r1} \sum_{j=1}^{r2}[A_i=B_j] 的和式,然后直接莫队就行了。
莫队复杂度是 O ( n q ) O(n\sqrt{q}) ,块大小应该设成 n / q n/\sqrt{q}

Day1T2

题意

有一个 r c r*c 的网格,每行每列都有一条铁路,乘坐一次可以在该行或该列任意旅行,费用为 r i r_i c i c_i 。有 n n 个城市 ( x i , y i ) (x_i,y_i) 遇到暴风雨,会使得经过该行或该列的整条铁路停运至第 d i d_i 天(即使没有经过该城市)。另有 a a 个机场 ( x i , y i ) (x_i,y_i) 在第 d i d_i 天启用,任意两个已启用的机场都有航线,费用为 c a ca
现在有 m m 组询问 ( ( s x i , s y i ) , ( t x i , t y i ) ) ((sx_i,sy_i),(tx_i,ty_i)) ,询问最早哪天能从 s i s_i 到达 t i t_i ,以及在天数最少的前提下的最小花费。
r , c 100000 , n , a m i n ( r c , 250000 ) , m 1000000 r,c\leq 100000 ,n,a \leq min(r*c,250000), m \leq 1000000

题解

先求最小天数。
没有机场的话显然最多拐两个弯,画画图就知道了,这个比较好维护。
有机场的话,显然会走到最近的最早开的机场,这个也可以维护,只要考虑出发点是不是机场,该行/列有没有机场,否则先走行还是列。
再将询问按最小天数离线,依次把城市和机场按天数插入,类似维护一下最小费用(只考虑当前可以用的铁路和机场)。
时间复杂度因为要排序,是 O ( m l o g m ) O(mlogm)
发现什么数据结构都不用,场上就是不会。

Day1T3

题意

有一个长度为 n n 的序列 A A ,想将它变成另一个序列 B B ,满足 B i m i n ( A i , m v + 1 ) B_i\leq min(A_i,mv+1) 。你可以使用操作 ( l i , r i , v i ) ( l i r i , 1 v i m v ) (l_i,r_i,v_i)(l_i\leq r_i,1\leq v_i\leq mv) ,意思是将 [ l i , r i ] [l_i,r_i] 间的数对 v v 取min。
问有多少长度不超过 m m 的合法操作序列。一个操作序列是合法的,当且仅当它能将 A A 变成 B B ,且它的任意一个非自身前缀均不能将 A A 变成 B B
答案对 1 0 9 + 7 10^9+7 取模。
n 100 , m , a i , b i , m v 1 0 9 n\leq 100,m,a_i,b_i,mv\leq 10^9

题解

考虑忽略任意一个非自身前缀均不能将 A A 变成 B B 的限制,设这样长度为 i i 的合法操作序列有 g i g_i 个。
注意到 A A 序列的信息只有 A i A_i 是否与 B i B_i 相等是有用的。因此可以考虑容斥,即钦定前 i i 次操作后 A j A_j 是否与 B j B_j 相等,不相等将 B j B_j 1 1 。设这样得到的序列为 B B'
这样,每次只需关注有多少个操作被允许, [ l , r ] [l,r] 能贡献 m v m i n l i r b i + 1 mv-min_{l\leq i \leq r}b'_i+1 个操作。由于 B i B i B i + 1 B_i\leq B'i\leq B_i+1 ,因此最多只有 O ( n 2 ) O(n^2) 种不同合法操作数,每个区间是否 1 -1 取决于是否至少有一个原来的最大值 + 1 +1
这样,将每个区间对应到原来的最大值上,将相同的数字一并dp即可,然后做背包合并,求出每种合法操作数的容斥系数。复杂度为 O ( n 4 ) O(n^4)
这样有 g i = j ( f i r j ) i g_i=\sum_{j}(fir-j)^i
又有 f i = g i g i 1 m v f_i=g_i-g_{i-1}*mv ,于是发现 i = 1 m f i \sum_{i=1}^{m}f_i 是若干个等比级数乘上系数的前缀和,直接按公式算就行了。这部分复杂度为 O ( n 2 l o g m ) O(n^2logm)
时间复杂度 O ( n 4 + n 2 l o g m ) O(n^4+n^2logm)

Day2T1

题意

有一棵 n n 个点的树,每条边 ( u , v ) (u,v) 有权值 ( a i , b i ) (a_i,b_i) ,每个点上也有一个人,权值为 ( c i , d i ) (c_i,d_i) d i s ( i , j ) = e k p a t h ( i , j ) m i n ( a k + c i , b k + d i ) dis(i,j)=\sum_{e_k\in path(i,j)}min(a_k+c_i,b_k+d_i)
i = 1 n j = 1 n d i s ( i , j ) \sum_{i=1}^{n} \sum_{j=1}^{n}dis(i,j)
n 500000 n \leq 500000

题解

考虑统计每条边的贡献,只需求出子树内/外满足 c i d i b j a j c_i-d_i \leq b_j-a_j 的数字个数与和。dfs序可持久化线段树或线段树合并即可。
时间复杂度 O ( n l o g n ) O(nlogn)

Day2T2

题意

交互题。
有一颗 n n 个点的树。树上的边未知。
有两种询问,第一种是给定一个可重集,询问选择一个点,到达集合中所有点的距离和的最小值,第二种是给定一个可重集,询问到达集合中所有点的距离和最小的点,有多个会任意返回一个。
询问一个大小为 s |s| 的集合花费 O ( s ) O(|s|) 的时间。
第一种部分分要求用 O ( n ) O(n) 次询问一和 O ( n ) O(n) 次询问二还原整棵树。
第二种部分分要求用 O ( n l o g n ) O(nlogn) 次询问二还原整棵树。
n 4000 n\leq4000

解法

考虑将点 0 0 做根,询问出其他点的父亲。
先用 O ( n ) O(n) 次操作一询问出每个点的深度。然后变为对每个深度为 d d 的点,在所有深度为 d 1 d-1 的点中找一个父亲。
对于第一种部分分,可以每次将这个点复制 s z d 1 1 sz_{d-1}-1 份,再将所有深度为 d 1 d-1 的点加入集合,做询问二。这样,它的父亲一定是唯一的带权重心。
对于第二种部分分,考虑二分,每次判定一个集合中是否有这个点的父亲。可以做两次询问一,第一次将这个点复制 s 1 |s|-1 份,第二次复制 s |s| 份,当且仅当两次变化量为一说明这个集合中有它的父亲。
时间复杂度 O ( n 2 ) O(n^2)

Day2T3

题意

平面上有 n n 个不重合的点 ( x i , y i ) (x_i,y_i) 。一个点集合法当且仅当它形成一个非退化凸多边形且任意三点不共线。问所有合法点集面积的期望与方差。
答案对 998244353 998244353 取模。
n 400 n\leq 400

题解

实际上只需要知道合法方案的数目,面积和,面积平方和。
考虑枚举凸包的最左与最右点,发现上凸壳与下凸壳是独立的,每次加入一个点,只需要看最后两条边的叉积与 0 0 的大小关系。
于是可以设一个dp, f i , j , k f_{i,j,k} 表示当前点为 i i ,上一点为 j j ,最左点为 k k 形成下凸壳的方案数,其他量的定义类似。枚举下一个点 O ( n ) O(n) 转移,复杂度为 O ( n 4 ) O(n^4) ,无法通过。
考虑优化转移。转移成立只需叉积小于 0 0 ,因此只跟两条边的斜率有关,于是可以将点 i i 的邻接点按斜率排序后two-pointer维护前/后缀和。
时间复杂度 O ( n 3 ) O(n^3)

猜你喜欢

转载自blog.csdn.net/qq_38609262/article/details/86725631