JOISC2021口胡题解

有些题不会,咕咕咕。

Day1T2

发现当\(1\)的方向确定后,其它点的方向都确定了。可以考虑病毒随便可以走,一个人必须沿着一个方向一直走下去,看这个病毒是否有可能追上这个人。发现可能的方向唯一。

用喜欢的方法模拟即可。

Day1T3

离线做法:对于一个队列\(x\),通过离线可以维护出从头到尾加入了什么,对于一个询问求出在队列上的区间\([L,R]\)。处理\(L,R\)可以用吉司机线段树。

在线做法:同样用吉司机线段树维护出\(L\)。用主席树来维护在某个时间中一个队列中加入过多少个数。查询的时候先二分时间,然后在主席树上查得到加过多少个数,然后比较一下。这部分时间\(O(n\lg^2 n)\)

Day2T1

首先求出从每个点出发,初始时间为\(0\),到达其它点的最短时间。显然可以先求出一天之内的,然后连边,然后floyed做。

考虑从一个点\(S\)出发到其它点的距离,根据它的出发时间,可以把距离看成\(O(m)\)段。按照出发时间从大到小搞,之前有些不能走的边可以走了,然后进行更新。总时间\(O(nm^2)\)

其实也可以直接考虑一条边\((u,v)\)的有效时间,设为\(tim\),把\(c_i\le tim\)的边拉出来,反过来从\(u\)开始跑最短路,对于每个\(S\)得到\(dis_{tim}(S,u)\);然后再从\(v\)开始以\(tim\)时开始往后跑,处理出到每个点\(T\)的时间;于是就可以更新\((S,T)\)\(S\)的某个时间段出发,到达\(T\)的时间是多少。

询问直接找到在哪个时间段即可,然后枚举一天内能到达的点,再用一开始预处理的东西去查即可。

Day2T2

二分。转化成切比雪夫距离,变成二维数点。

最后输出具体方案的时候,直接用个固定长度的滑动窗口扫过去,维护另一维上点的分布。这样就可以精准找到。

时间\(O(n\lg^2 n)\)

Day3T1

考虑给第一个X标1,第一个X后面的所有Z标1,其它标0。遇到第一个1加入栈,后面遇到0加入栈,遇到1把栈清空到只剩下一个数。显然这最优。于是就有了\(n\)的做法。

注意到如果有Z连续,那就把最后一个Z标1。假装在第一个X后面加0,于是就得到一个长度为\(n+1\)的1不相邻的串。

用点简单生成函数算一下发现大概是\(F_{n+1}-F_n\)\(F\)为斐波拉契数列)种方案,估计一下大概是\(2^{69400+}\)

考虑压缩起来。一种做法是强套平常的压缩方式,即算出后面的方案数,按位确定,要写高精度。

gmh77的做法:给序列分块,每个块分别用那种压缩方式。发现块大小取67的时候最合适。可以不用取高精度。

Day3T2

可以把人的移动抽象成\(t-x\)图像。把每条线段延长,另外对于线段的端点,作条垂直于这条端点的直线。于是得到了个网格。

在网格点上DP,每次只需要从右上和右下转移过。对于每个询问,定位并找到网格上的最近点。

总时间\(O(n^2 +q\lg n)\)

Day3T3

直接线段树合并或启发式合并或长链剖分之类的都可以做。

也可以点分治。点分治中子树大小其实可以只记当前连通块中的,分析下可以发现考虑算少的不会有影响。

当然我自己写了个\(O(n^2\lg n)\)过了。

Day4T1

按位确定。现在相当于求一个区间内能搞多少个不相交的。发现选了一个之后一定是贪心选和它不交的右端点最小的,连边,然后倍增处理。

Day4T2

先把每个九宫格划分成一个单位。一号位到七号位来标对应编号的目标在哪(以它为观测点,把平面划分成13块),九号位搞个特殊标记。这样就可以得到做到\(14\)

注意到一共只有7个目标,至少有两个号位不会被占用。

于是稍微修改一下九宫格的划分,让五号位一定不会被占用;对于另一个不会占用的号位,用八号位记一下是哪个。

这样就能做到\(12\)

Day4T3

写出DP。发现dp中的值满足单调性,于是可以很方便地用线段树维护。

维护个线段树满足查询最小值,区间加,区间赋值,线段树合并,线段树上二分即可。

posted @ 2021-03-24 14:47  jz_597  阅读(388)  评论(1编辑  收藏  举报