JOISC2021题解(部分)

  • gugugu

Day1

  • B:首先枚举1的出发方向,可以发现每一个点首先可以选择两个方向,夹角部分包括了1,再观察一下可以发现实际上这两条中只有一条有用,因为在传染的进行中对角线也要包括1,优先感染能够感染的,模拟即可。
  • C:先不考虑颜色的问题,求出如果没有删除操作每一次询问是当前队列的第几个。相当于是要维护一个区间加,区间减,以及区间对0取max,查询的时候用总的个数减去当前操作减法后的个数即可知道当前在总队列中的起点是什么,这个可以用吉司机线段树去做。之后可以整体二分?也可以直接对于维护一个询问min,每一次区间加超过了min就暴力找到并更新即可。

Day2

  • A:如果是在一天之内到达,不妨将从 x x x出发的一天之内的时间分成 n 2 n^2 n2段,以某一条边消失的时间为终止倒着到 x x x的时间节点分开,用 n 4 n^4 n4预处理,具体可以按照时间一条一条加进去,然后单源最短路进行更新。对于每一个询问只需要找到对应的时间段即可 O ( 1 ) O(1) O(1)询问。如果隔了若干天到达,那么先到一个点,再预处理跨天的最短路到达 t t t,时间复杂度 O ( n 4 + q n ) O(n^4+qn) O(n4+qn)

  • B:先二分距离,然后计数,转换为一个个正方形,求内部的点的个数,直接扫描线加主席树即可。最后求每一个的时候可以直接在主席树上的叶子一个一个找,叶子下面挂当前的根新加入的节点,实际上由于所有正方形边长相等,可以双指针扫一下,暴力取出来即可。

Day3

  • A:先找到第一个X,然后对于之后的每一个Z,从后往前做到上一个Z的位置或做到第一个X处。因此只需要将上面的所有位置打上一个1即可。现在要传一个长度为100000的01串,满足没有1相邻,只能有70000个。可以直接按照组合数按位确定,这样可以卡到下界,实际上由于相邻的不同可以用递推代替组合数,并且下界并不是特别紧,可以分段,每一段传一个组合数。
  • B:考虑把一个人的轨迹看成 ( T i , A i ) (T_i,A_i) (Ti,Ai) ( T i + ∣ B i − A i ∣ , B i ) (T_i+|B_i-A_i|,B_i) (Ti+BiAi,Bi)的一条直线,其中有一部分有 C i C_i Ci的权值,从向左的人转化为向右的人相当于是两条直线相交,从一个人走到另一个同向的人只会在一个人结束或另一个人开始或结束的时候转向,因此可以在每一条线段的端点处新增一条垂直的直线供转移,那么可以得到一个网格图,每一条边有某个边权,直接暴力DP就可以做到 9 n 2 9n^2 9n2,因为最多有 3 n 3n 3n条直线。对于询问可以往右上角的和右下角走,对于每一个交点要处理一个到网格点的贡献加上网格点的DP值,是一个 k x + b kx+b kx+b的形式,暴力可以 O ( n 2 + n 2   l o g   n ) O(n^2+n^2\ log\ n) O(n2+n2 log n)计算 n 2 n^2 n2个凸包,然后对于每一个询问就可以 O ( l o g   n ) O(log\ n) O(log n)定位再加上 O ( l o g   n ) O(log\ n) O(log n)找凸包上的最大值即可。时间复杂度 O ( n 2 l o g   n + q   l o g   n ) O(n^2log\ n+q\ log\ n) O(n2log n+q log n),当然,是一个大常数。
  • C:相当于是找两个子树,取min然后将它们的根的距离贡献到min上,然后再后缀max一下即可。可以用线段树合并做,直接按照子树大小打上去,只需要维护一个区间加的标记,和一个计算答案的标记,线段树合并的时候顺便贡献一下答案。或者可以点分治,可以证明的是仅仅讨论当前分治重心之内的就好了,并不需要跨到外面去。

Day4

  • A:直接按位确定,转化为计算区间内最多取多少个,先把包含去掉,然后用倍增或分块从左端点跳出去即可做到 n   l o g   n n\ log\ n n log n n n n\sqrt{n} nn
  • C:对于环套树,先把树处理了,从叶子往上面dp,设后面最小值为状态,用线段树维护,由于这个状态自带一个后缀取min,因此可以从前往后差分,维护dp差分的结果,维护一个区间和即可,然后线段树合并即可。环上讨论一下。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值