JOISC 2018 题解

1|0JOISC 2018

loj 上有几乎全部的题目,写了题意的就是 loj 上没有的。

1|1D1T1

简单题。

根据颜色段均摊的结论,每个点到根的路径上颜色段的总和是 O(nlogn) 的,于是直接每次暴力找颜色段即可。复杂度 O(nlog2n)

提交记录

1|2D1T2

又是计算几何。

我们需要画出一条闭合折线,并且能够把正方形包围。

考虑我们一定是把已有栅栏用新的栅栏连起来,或者是让已有栅栏和正方形边界连起来。因为栅栏不能在正方形内,我们把两个栅栏连接起来一定不会只用正方形一条边界的一部分,这样一定是不优的,因此我们可以把只把正方形的四个角当成栅栏,这样我们就只需要考虑连接两个栅栏的贡献了。

对于每一对栅栏,我们求出连接这两个栅栏最小的代价和这条线段。如果这条线段和正方形有交,我们就不能选,而且我们用其他方式连接这两个。现在问题就变成了找最小的环使得包含这个正方形。

对于判包含,我们可以从正方形中引出一条射线,如果这条射线经过了折线奇数次,就说明被包含了。

于是对于每一对栅栏,我们求出连接这两个点的线段经过了射线多少次,这样我们的问题就是求一个经过射线次数为奇数的最小环,可以用 Floyd 解决。

复杂度 O(n3)

提交记录

1|3D1T3

简单计数题。

显然可以想到按行 DP,然后维护当前还可以放帐篷有几列。设 f[i][j] 表示考虑了前 i 行,有 j 列还可以放帐篷,转移有 4 种:

  1. 这一行不放帐篷,f[i][j]f[i1][j]
  2. 这一行放两个帐篷,f[i][j]f[i1][j+2](j+22)
  3. 这一行放一个帐篷,且以后不会和其他帐篷在同一行,f[i][j]4f[i1][j+1](j+1)
  4. 这一行和这一列之前一行放帐篷,f[i][j]f[i2][j+1](j+1)(i1)

复杂度 O(nm)

提交记录

1|4D2T1

题目等价于求有多少个排列满足有 k1 个位置满足 pi>pi+1,这就是欧拉数。

即一个排列中满足 pi<pi+1 的位置(记作升高)有 k 个,那么这样的排列个数就是欧拉数 nk

我们考虑从小到大加入数。加入 n 时,有 4 种方法:

  1. 放在开头,升高不变,从 n1k 转移过来。
  2. 放在末尾,升高多 1,从 n1k1 转移过来。
  3. 插入到升高中,这样不会新产生升高,有 kn1k 种。
  4. 不插入到升高中,有 (nk1)n1k1 种。

于是有

nk=(k+1)nk+(nk)nk

然后根据 n1=2nn1,我们猜测 nk=i=0k(1)i(n+1i)(k+1i)n

可以通过递推式来证明。

因为 f(x)=xn 是完全积性函数,于是可以用线性筛来求,复杂度 O(n)

提交记录

1|5D2T2

提交答案题。容易想到这 k 条边一定是连成菊花图,那么就可以考虑爬山。

我们每次先选定中心点 rt,然后枚举选择与哪些点相连,但是估价函数是 O(n2) 的,很耗时,那么不妨改成 dis(rt,i)

对于初始态,可以对枚举每个点作为中心点,然后按度数从大到小选取作为初始状态,选择较小的几组即可。

提交记录

1|6D2T3

容易发现每个人都是隔 ti 时间移动 di 单位,那么求出 ti 即可。而且 ti 一定是 ti1 的若干倍,可以简单求出。最后询问时二分即可。

提交记录

1|7D3T1

传送门

题意:Alice 有一个 n 个点的无向图,她可以给 Bob 传一个点数不超过 n+12 的无向图,点会被打乱,Bob 需要还原出这张图。

思路:一开始以为不用还原标号,后来才发现连标号都要还原。

既然和标号相关,而且还多了 logn+2 个点,那么不难想到二进制分组。

难点在于怎么确定用来二进制分组的那 10 个点。

因为多了 2 个点,记为 u,v,我们可以先用 u 和处了 v 之外的点连边,再用 v 和那 10 个点连边。

然后考虑怎么确定这 10 个点的顺序。我们发现,第 1 个点的度数一定比第 10 个点的度数大,于是可以把这 10 个点连成一条链,这样就可以求出顺序了。

提交记录

1|8D3T2

考场上想到了根号分治,但是没想到是对询问根号分治。

考虑我们有两种做法,一种是每次询问 O(n) 求答案,一种是提前求出到每个点距离前 k 大的点,于是就可以根号分治,如果询问中删掉的点数小于 B,就用提前预处理出的距离前 B 大的点来求,否则就暴力 O(n) 跑一遍,复杂度是 O(nB+QB+nQB)=O(nq(n+q))

提交记录

1|9D3T3

巨大 DP。

首先自然是把左括号看成 1,右括号看成 -1,那么条件就是翻转(同时反转)前后前缀和非负。

那么现在分成 4 种,两侧都合法,翻转前合法翻转后不合法,翻转前不合法翻转后合法,翻转前后都不合法。

第一种情况,等同于是合法括号串,容易 O(n2) 解决。

第二种情况和第三种情况本质相同。

记前缀和为 si,我们要翻转的区间肯定覆盖了第一个 si<0 的位置 p,而且显然是 si 越大越好,那么 sl 就是 s1sp 中的最大值。

对于 i>r 的部分,翻转后为 sisn,显然是合法的。

sl=a,sn=b,那么有 sr=a+b2。如果 ab20,那么 (l,p] 中存在满足条件的 r。否则就需要满足 spsr 中最大值不超过 2a。记 ti=sisn,那么有 tr=ab2,限制是 [p,r]ti 最大值不超过 2(ab2)

于是可以枚举 ab2 然后 DP。前缀需要记录当前和历史最前缀和,可以维护 f[i][a] 表示 si=1maxsi=a;后缀可以维护 g[i][j][k] 表示 ti=jk{0,1} 表示是否确定了 r

最终答案是 f[i][a]g[i][b1][a+d2<0]

然后是第四种情况。我们找到第一个 si=1 的位置 psisn=1 的最大的位置 q,设 s1sp 中最大值为 asn=bsqsn 中最大值为 c,如果 a+b2c,我们以 s1sp 中最大值位置为左端点,取 sqsn 中第一个等于 a+b2 为右端点,然后就可以类似上一种的情况转移。如果 a+b2>c,翻转后就是 a+b2c 的情况。最后要减去 a+n2=c 的情况。

复杂度 O(n3)

提交记录

1|10D4T1

经典反悔贪心模型,我们取一个位置后把这个位置两边的数减去自己这个答案加入考虑范围,这样之后取这个数就相当于是把这次的操作反悔了。

提交记录

1|11D4T2

首先可以用 n 次确定一个在边界上的数,然后考虑每次二分出贴近当前已经确定的部分的数。

具体地,假设当前二分的是 mid,如果我们询问所有未确定的大于等于 mid 的数,再询问一次加入边界的结果,就可以知道边界上的数和 mid 的大小关系。

总次数 O(n+2nlogn)

提交记录

1|12D4T3

没想到图论还有 DDP。容易想到对于任意两点,维护最短路和初边、终边都不一样的次短路,但是这样是假的,有时候只会限制出边、终边中的一个,于是我们就维护 4 条路径。记 s,t 为初边终边,那么就是以下 4 种:

  1. (s1,t1),最短路;
  2. (s2,t2),其中 s2s1,t2t1
  3. (s3,t3),其中 s3s1,t3t2
  4. (s4,t4),其中 s4s2,t4t1

这些路径可以用 (min,+) 矩阵维护,然后这就是 DDP。

现在的问题是怎么求这 4 条路径。

因为和边关系密切,我们可以把无向边拆成两条有向边,然后求边间的最短路。

复杂度 O(m2logm+43nlogn)

提交记录


__EOF__

本文作者Xttttr
本文链接https://www.cnblogs.com/Xttttr/p/18013753.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Xttttr  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
历史上的今天:
2023-02-12 NOIP2022游记
2023-02-12 CF1167G题解
点击右上角即可分享
微信分享提示