JOISC 2021 泛做记录

LOJ #3488. 「JOISC 2021 Day1」IOI 热病

标签:结论,贪心。

首先把一号点移到原点,枚举一下它的方向,有 4 种情况。

以向右为例,由于我们要最大化感染人数,与 1 号点在同一水平面上的肯定相向而行最优,其它点越靠近 1 的方向走是最优的...吗?

放宽条件,在 t 时刻被传染到的点一定满足 |x|+|y|t,反之不一定成立,考虑一个在 (xp,yp) 的点,假设 xp>yp0,显然不会向右向上,而如果向下,根据 |x|+|y|t 的条件,当它走到 y=0 这条水平线时,以原点为中心的菱形都没有覆盖到它,之后更不可能覆盖到它了,于是只能向左,即选择垂直于绝对值更大的那条直线

但当 |x|=|y| 时会出现一点小问题,此时虽然看起来向左向下理论上都可以满足,但由于 1 号点第一步是向右的,往左走的一定碰不到。可以得到一四象限的往 x 轴走,二三象限往 y 轴走是最优的。

得到每个点的移动方向后,可以直接模拟,把可以传染的点对建边,一定在 y=xy=x 的直线或一条水平 / 竖直直线(取决于该点方向),类似 dijkstra 每次找时间最小的点松弛即可。时间复杂度 O(n2)

优化就注意到可以预处理每条直线上的点,一个点能松弛的点一定是一段前缀或后缀,没必要全部更新,真正有效的点只有第一个满足的点,取出后再更新下一个点。

LOJ #3489. 「JOISC 2021 Day1」饮食区

显然,只需要得到当前被 pop 了多少人,就可以在主席树上二分得到答案。

维护每个点的 pop 人数只要用总的减去当前人数即可,而当前人数的变化只有区间加,区间减一个数后对 0 取 max,segment beats 维护。

LOJ #3491. 「JOISC 2021 Day2」道路建设

本质上就是求曼哈顿距离前 k 小的点,KDT 结合一下估价函数即可,时间复杂度未知,但是跑的飞快。

正确做法应该是先转成切比雪夫距离,变成了一个正方形,只需要二分后双指针数点即可,找到合法点也是容易的。

LOJ #3494. 「JOISC 2021 Day3」保镖

由于涉及到时间空间两个维度,考虑将一个 VIP 的路线刻画成一个平面直角坐标系上的直线,起点 (Ti,Ai),终点 (Ti+|BiAi|,Bi),保镖同理,转化成每次往左上面走或者往右上走。

注意到斜率都为 1 或者 -1,考虑将坐标旋转 45 度,此时线段长度增大了 2 倍,再增大 2 倍变成 (x+y,xy) 方便处理,最后把答案 /2 即可。

此时每一个 VIP 都是一个水平或竖直线段,每次只能往上或右,所求即是选择一个路线最大化路径带权总和。

注意到 n 不大,一个保镖的行动路线必然是先往上走到达一个水平直线然后往右,走到一个交点处;要么先往右走到达一个竖直线往上,也会在交点处决策。因此可以 DP 预处理所有交点的最优方案,转移是显然的,可以 O(n2) 预处理。

此时再枚举,就有一个 O(qn) 的做法,在震撼的 25 s,2GB 的时空限制上居然可以通过。

考虑优化掉选择点的过程,设初始保镖在 (x,y),找到离散化后的 比 x,y 大的第一个位置 (u,v),显然可以用 dpu,v 更新答案,否则必然有相交,以水平线为例,相交长度是已知的 (ux),贡献是 (ux)×cp+dpu,yp ,是一个一次函数的形式。

对每个 u 开一颗李超树,扫描线一下即可做到 O((n2+q)logV)

LOJ #3495. 「JOISC 2021 Day3」聚会 2

显然 j 是奇数根据带权中位数唯一可知答案是 1,否则设点集为 V,显然 V 的重心是合法的,合法的是一条经过重心的路径。这条路径满足:V 中所有点平均分成两半,一半在端点上,另一半在另一个端点上(最开始以为一定是直径的一段前后缀吗,但不一定成立)。

于是可以把合法点对 (u,v) 根据是否为祖先关系分成两类。对于不互为祖先后代的,设 szx 表示 1 为根的 x 子树大小,贡献到 2×min(szu,szv) ,贡献为 dis(u,v),做个后缀和就是答案。这一部分的计算可以枚举答案 c,将所有 szc 的点拉出来求虚树直径,但显然总点数 O(n2) 无法接受。

考虑经典的 euler 序求直径的方法,由于贡献为 dx+dy2dz,拍平到 dfs 序后,就是选择两个点 u<v,再选择一个 z(u,v),最大化 au+avbz,显然可以用线段树维护。

其实根本可以不用 euler 序求 lca,dfs 序也是可以的。将树拍平到 dfs 序后,下标 i 保存 fafpi,则 (u,v) 的 lca(dfnu<dfnv) 为 [dfnu+1,dfnv] 的深度最小的点,原因是显然的:随着 dfn 的变化一定是先到达 u 子树,再是 u 父亲除了 u 方向的儿子,最后一定到达 vl 方向的第一个点,若 u,v 不互为祖先关系将 dfnu +1 可以保证正确性。

根据上面的分析,将 euler 序变成 dfs 序同样可以保证正确性。

否则贡献为 min(szv,nszp),其中 puv 方向第一个点,枚举 p。当 szvnszpansszvdvdu,这一部分枚举 v 找找最浅的祖先。否则 szv>nszpansnszpdvdu,用线段树合并即可。

时间复杂度 O(nlogn)

LOJ #3496. 「JOISC 2021 Day4」活动参观 2

显然字典序最小可以贪心,从小到大枚举当前 i 是否选,然后贪心选剩下的点看是否存在合法方案,可以 O(n2)

注意到选择若干个区间后剩下还是若干个区间,我们要动态维护者需区间的答案,而这些区间是不受前面更改区间的影响的。设 f(l,r) 表示区间 [l,r] 的答案,可以通过倍增预处理,设 fi,j 表示的从 i 号点出发走 2j 个区间的最靠左的右端点,O(nlogn)

动态的区间变化就考虑用 set 维护当前存在的合法区间,若加入一个 [l,r] 合法当且仅当存在 [l,r][L,R],且删去 [L,R],加入 [l,L],[r,R] 后仍然合法。

LOJ #3498. 「JOISC 2021 Day4」最差记者 4

显然将对应边建出来是一个基环树,环上的点权值必然相等,只用考虑树,是一个被做烂的线段树合并优化 dp。

在环上就先把所有树的线段树合并起来,枚举取值即可。

LOJ #3470. 「JOI 2021 Final」集体照

pi 表示值为 i 的数的位置,容易发现最终序列是由若干段拼接而成的,每段形如 l,l+1,,rr,r1,,l,且前面的逆序对直接继承,于是直接设 dpi 表示前 i 个数的答案,每次算一下正序的答案和逆序的答案加上之前的答案即可。

时间复杂度 O(n2)

LOJ #3471. 「JOI 2021 Final」机器人

只要把边建出来就行了,剩下的跑 dijkstra。

设一个点 x 连向的边权总和为 S,对一个 (v,c,w) 而言,连边 (x,v,min(w,Sw))

同时,对于一个点连出的所有同色边而言,若该点一次作为出点一次作为入点,只需要改某条边除外的颜色即可,设两条边权值排名为 rk1,rk2(从大到小),若 rk1>2rk2>2 显然不改最优,否则可能的边只有 2 个,把最大和次大的边暴力地和其它边加边即可。

LOJ #3472. 「JOI 2021 Final」地牢 3

LOJ #3520. 「JOI Open 2021」杂交

J=0,O=1,I=2,杂交相当于 c=(a+b)(mod3)

设最后 SA,SB,SC 杂交系数为 a,b,c(0a<3) ,容易发现只要满足 a+b+c1(mod3) 即可,因此本质不同的个数很少,直接哈希即可,每次区间修改用线段树维护。

LOJ #3521. 「JOI Open 2021」决算报告

直接按下标进行 dp 不太好处理,考虑按照权值从小到大来转移,每次只从已经更新过的 dp 值转移过来。

只需要找到哪些被更新过的位置满足 |pipj|k,可以直接并查集合并相邻不超过 k 的下标,然后在线段树上查询。

LOJ #3275. 「JOISC 2020 Day2」有趣的 Joitter 交友

考虑什么样的“块”可以在加入若干条边后合并,经过手玩可以发现,将原图中的极大团看做一个块,则构成了一个 DAG 的结构,若存在 uv 边,设 u 所在团为 xvy, 则 u 和所有 y 中点都会有边,只要在加入一条反向边,设为 (z,r) ,则 z 和所有 x 中点会有边,因此 (z,u) 变成双向边,则 x,y 每块中的所有点都会被合并到一起,构成了新的块。

考虑答案的计算,设一个块大小为 s,连向这个块的点的并大小为 p,则贡献为 s(s1+p)。因此只需要在加边后动态维护每个极大团的点集合,入边集合(块之间的),出边集合,连向块的入点即可即可。全部操作可以启发式合并完成。

由于合并了两个块后可能产生新的合并,用队列维护所有可能的合并即可。

时间复杂度 O(nlognlogm)

LOJ #3033. 「JOISC 2019 Day2」两个天线

|hihj|=max(hihj,hjhi),因此做两遍即可。

离线询问,一个 i 作为左端点能贡献的区间为 [i+ai,i+bi],扫描线一下,若 i 作为右端点,则在 [ibi,iai] 区间加,问题转化成一个序列,每个位置有 ai,bi,每次对 ai 单点改,区间 bi 对某个数 max,询问一个区间的历史最大 ai+bi

历史最大的条件直接维护一个全局答案即可,区间取 max 维护一个 ai 区间 max 更新答案,再打一个 tg 即可。

LOJ #2834. 「JOISC 2018 Day 2」修行

knk,问题变成计算 nk

nk=i=kn(1)ik(ik)[xn](ex1)ni=i=kn(1)ik(ik)j=0ni(nij)jn(1)nij=j=0nkjn(1)njki=0nj(ik)(nij)

根据上指标范德蒙德卷积可知

=j=0nkjn(1)nkj(n+1j+k+1)

EI & alpha1022 txdy!

转化为计算概率,最后乘上 n! 即可。

考虑 n 个取值在 (0,1) 的实数,则 nkn! 表示有 ki=1n1[ai+1>ai] 的概率。

考虑其差分,设 bi=aiai1mod1=aiai1+[ai<ai1] ,则

i=1nbi=i=1naiai1+[ai<ai1]=an+n1k

因此 bi(nk1,nk),问题转化为:

(0,1) 中随机 n 个实数 bibi<x 的概率。

问题差分即是答案。

b 没有上界时,答案是 (nk)nn! ,否则,可以考虑容斥,钦定 i 个数 1,则有:

ansk=i=0nk(1)i(ni)(nki)nn!

LOJ #2839. 「JOISC 2018 Day 3」安全门

首先假设 S 已知,若反转 [l,r] 合法当且仅当:

  • si0i[1,l1]
  • 2sl1si0i[l,r]
  • sisn0i[r+1,n]
  • sr=sl1+sn2

显然 n 为奇数无解。若 S 已经满足所有前缀和以及所有反转后的后缀和 0 不用操作,可以简单 O(n2) 计算。否则,有三种情况:

  • 前缀合法,后缀不合法。
  • 前缀不合法,后缀合法。
  • 前缀不合法,后缀不合法。

先考虑前两种,只考虑前缀不合法情况,后面的将整个串反转再翻转同样计算。

由于后缀已经合法,sisn,由于前缀不合法,i,s.t.si<0 ,因此 sn<0

最优的 l1 显然在满足 1 的条件下越大越好。设第一个 s<0 的 位置为 i,则 l1 应该选择 [1,i) 的最大值,再取后面第一个 sr=sl+sn2r,且要求这些的 si2sl1。因为 sl1 越大 2 越容易满足,且由于 sr<sl1s 是连续变化的,越大的 s 越容易找到 r

不妨设 a=sl1,b=sn,即 sr=a+b2si2a

sr0 时,l1ri 的同一侧,显然满足 si2a,否则,由于直接将 sn 计入状态复杂度太高,考虑将所有 i 的前缀和减去 b,就要满足 si=b1,sj0(j[i,n]),sn=0,sj2ab),sr=ab2

不妨枚举 t=ab2,从后往前转移,满足所有 s0,顺便确定 r 的位置,是最后一个满足 s=t 的数,且最后的 si=b1

dpi,j,0/1 表示从后往前考虑到 i,目前 s=j,是否已经选出了 r 的方案,当确定了 r 后,不能再有 j=t,且 j2t。容易 O(n3) 转移。

还需要拼上一段前缀,设 fi,j,k 表示从前往后考虑到 i,目前历史最大为 j,当前为 k 的方案,将所有 k=1 的状态记录到 hi,j 中。容易预处理。

在枚举了 t 后,再枚举 a 得到 b,再枚举分界点,即 ta=0t1l=1nhl,adpnl,b1,[a+b2]<0

当前后缀都不合法时,我们还是找到第一个前缀 <0 的位置 i,以及后缀第一个 <sn 的位置 j,显然 i<j,否则必定有一边合法。设前缀最大为 a,后缀最大为 c,总和为 b,此时的策略是当 a+b2c 时,选择前缀最大,因为此时必然可以在后缀找到 sr=a+b2,否则选择后缀最大,同理翻转再反转序列后计算。

还是将后缀减去 b,变成:

  • si=b1,sn=0
  • [i,r] 中的数 2ab

之前计算前缀的 h 可以保留,对于后缀,设 gi,j,0/1/2 表示没有选出最大值 / 选出了最大,但还没有 s=1 (当 s=1r 就确定了,且前面这一部分必然是合法的)/ 选出了 r,此时要满足 si2t 的方案。

还是枚举 a,答案是 talhl,agnl,b1,2

注意处理算重(我才不会告诉你我是对着 Itst 的代码一点点看才看懂的)。

时间复杂度 O(n3)

本文作者:henrici3106

本文链接:https://www.cnblogs.com/henrici3106/p/17223960.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   henrici3106  阅读(82)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.