【WC2019笔记】IOI2018 / ACM题目选讲

哇!济南的 rqy 大佬讲课!就是 $luogu$ 上有名的那位!

上面这句话写错了,请大家无视

 

Xylophone
IOI2018 练习赛 T2
题意:交互提
有一个 $0\sim n-1$ 的排列,保证 $0$ 在 $n-1$ 左边。
你每次可以询问一个区间,会得到这个区间的 最大值 $-$最小值。
要用不超过 $10000$ 次询问还原出这个排列。
范围:
子任务 $1$($11pts$)$n\le 100$
子任务 $2$($36pts$)$n\le 1000$
子任务 $3$($53pts$)$n\le 5000$

题解
假设 第一个数 $<$ 第二个数,不妨假设第一个数是 $0$,之后再调整即可。
考虑询问所有长为 $2$ 的区间和长为 $3$ 的区间。
从左往右,考虑连续三个数 $x,y,z$,假设我们已经确定了 $x,y$ 的大小关系,那么
如果 $x,y,z$ 中最大值-最小值=$x-y$,说明 $z$ 在 $x,y$ 中间,根据 $y,z$ 的差可确定 $z$。
否则 $z$ 在 $x,y$ 之外,同样可根据 $y,z$ 的差确定 $z$。
$O(n)$ 枚举前两个数,然后 $O(n)$ 推出序列剩下的数。排除不合法的解后(即序列的值域不在 $[0,n-1]$ 范围内),如果一组合法的解中,$0$ 在 $n-1$ 的右边,把每个数 $x$ 变为 $n-x-1$ 即可。
设第一个数为 $0$,然后 $O(n)$ 推出序列剩下的数。假设序列的值域是 $[x,x+n-1]$,把序列中的所有数 $-x$ 即可得到值域正常的序列。然后如果这组解中,$0$ 在 $n-1$ 的右边,

Bubble Sort 2
IOI2018 练习赛 T3
题意:
给出一个长为 $n$ 的序列。
定义一次“挪动”操作为:从前往后考虑每个数,若 $A_i\gt A_{i+1}$ 就交换 $A_i$ 和 $A_{i+1}$。
现在有 $q$ 次修改操作,每次修改一个数,然后回答整个序列需要多少次“挪动”操作才能把序列排成升序。
范围:
$n,q\le 500000$

题解
~~冒泡排序裸题~~
首先考虑怎么计算答案。
观察冒泡排序的过程,可以发现每一轮做完之后,每个数前面的最大数(如果比它大的话)都会被放到它后面去。
于是答案应该是 $\max\{一个数前面比它大的数的个数\}$,也就是 $\max\{i-前面\le A_i 的数的个数\}$
可以用树套树或 $KDTree$ 维护,复杂度都爆。
注意到如果前后有两个数 $x,y$,$x\ge y$,那么 $x$ 是不可能成为答案的,因为此时 $x$ 的答案严格小于 $y$ 的答案。
把刚才的式子改成 $\max\{i-\le A_i 的数的个数\}$
当 $x$ 后面还有比它小的数时,会多减导致不优,但此时 $x$ 一定不会成为最优答案。
这样就可以用一颗线段树维护了,复杂度 $O(n\times log(n))$。

Road Service
IOI2018 练习赛 T4
题意:提答题
给出一棵 $n$ 个点的树,需要你加 $k$ 条边,使得所有点对之间的距离和最小。所有边长均为 $1$。
根据你的答案给分。
范围:
子任务 $1$($10pts$):$n=20,\space k=4$
子任务 $2$ 到 $5$ 不抄了,每个任务的分值都是 $18pts$。
子任务 $6$($18pts$):$n=1000\space k=300$

题解:
枚举一个点,把 $k$ 条加边都从这个点连出去,这样可以得到很优的答案。
证明:把 $k$ 条边的公共出发点设为根节点,
爬山?
考虑选出的 $k$ 个点的集合,随机进行调整,如果更优就记录下来。
任轩迪在模拟赛爬了 $91$ 分,试机赛爬了 $99$ 分……
$DP$?
假装我们是要选出 $k$ 个关键点,使得所有点到关键点的距离最小。
不考虑两点直达的情况。
再假装最优解里每个点到最近的关键点的距离不会太大(比如不超过 $10$)。
于是可以多项式时间 $DP$ 了,可以得到 $100$ 分。

组合动作(Combo)
IOI2018 D1T1
题意:交互提
有一个长为 $n$ 的只由 $ABXY$ 组成的字符串 $S$,保证 $S$ 的首字母只出现一次。你每次可以询问一个只由 $ABXY$ 四种字符组成的、长度不超过 $4n$ 的串 $p$,他会告诉你既是 $p$ 的子串又是 $S$ 的前缀的最长串的长度。需要你用最少的询问次数确定这个串 $S$。
范围:
见原题

首先用 $2$ 次询问确定首字母(默认你会二分)。
设已知的前缀是 $s$,每次询问 $sB$,如果不是就询问 $sX$,如果再不是就是 $sY$。
这样的步数是 $2n$,可以拿 $30$ 分。
注意我们可以把多个串连在一起,在一次中询问。由于首字母只会在 $S$ 中出现一次,回答出来的就是我们问的串的答案中的最大值。
仍然用 $2$ 次询问确定首字母,假设为 $A$。
考虑如何确定下一位,可以询问这个串:$sBsXBsXXsXY$。
如果询问结果是 $s$ 的长度 $+1$,下一位就是 $B$,如果是长度 $+2$,下一位就是 $X$,否则下一位就是 $Y$。
最后一步要多花一步特判,总共需要 $n+2$ 步,可以拿到 $100$ 分。

然而任轩迪大佬在考 $IOI2018$ 的时候用的方法跟这方法不太一样……

狼人(Werewolf)
IOI2018 D1T3

现在相当于求是否有一个点既在第一棵子树中,
相当于询问是否存在一个中间点 $X$,

排座位(Seats)

 

题意

有一个 $H\times W$ 的矩阵,里面是 $0\space \sim\space H\times W-1$ 的一个排列。

如果一个大小为 $k$ 的子矩阵里面恰好包含的是 $0\space \sim\space k-1$ 这 $k$ 个数,则称这个子矩阵是美妙的。

现在有 $q$ 个操作,每次交换两个点上的数,然后询问总共有多少个美妙的子矩阵。

范围

见原题

 

子任务 $1,2$

从小到大考虑每个元素的位置。求出前 $i$ 个数的横纵坐标的最大值和最小值。

子任务 $4$

注意到两人的位置交换后,只有处于它们之间的 $max_x,min_x,max_y,min_y$ 会变。

所以修改后只需要把中间这些信息暴力重算即可。

子任务 $3$

合法的矩阵不超过 $H+W$ 个。

考虑从 $1$ 所在位置开始,如果下一个数不在当前矩形里,那么长或宽至少要 $+1$。

复杂度 $O(2000\times Q)$。

到此为止,$IOI2018$ 现场大部分人拿了上述 $37$ 分。

子任务 $5$

相当于询问前 $k$ 个数是否构成一个连通块。由于 $H=1$,$k$ 个数当前连成一条链。

即询问“点数-边数”是否等于 $1$。点数就是 $k$,边数就是方块中两个数都 $\le k$ 的 $1\times 2$ 大小方块数量。

对于每个 $k$ 维护这个数量,一次修改时只会影响常数个 $1\times 2$ 方块(就是它所在的俩),对应到线段树中就是后缀加减操作。

询问线段树最小值及最小值的个数即可。

复杂度 $O(HW+Qlog(HW))$。

子任务 $6$

考虑沿用子任务 $5$ 的思想,相当于询问前 $k$ 个数是否构成一个连通块,且这个连通块是一个矩形。

不妨称 $\le k$ 的点为黑点,$\gt k$ 的点为白点。可以判断以下条件:

- 左边和上边都不是黑点的黑点有恰好 $1$ 个

- 上下左右有至少 $2$ 个黑点的白点只有 $0$ 个

条件 $1$ 保证了是一个连通块,条件 $2$ 保证了是个矩形。

注意到条件 $1$ 中合法的不会 $\lt 1$ 个,条件 $2$ 中合法的不会 $\lt 0$ 个,于是只要加起来看是否 $=1$ 就行了。

对于每个 $k$,

 

Rainbow
APIO2017 T1
题意:
有一个 $R\times C$ 的网络,有一条蛇,它从 $(r,c)$ 出发,按照给出的一个长为 $m$ 的移动序列往上下左右移动。它经过的格子都会变成河流。
现在有 $Q$ 次询问:给出一个子矩形,问这个子矩形内的陆地有多少个四连通块?
范围:
见原题

 

题解:

称河流为黑点,陆地为白点。那就是问一个子矩形内有多少白点构成的四连通块。

如果每个连通块都是树,那么连通块的数量就等于 点数 $-$ 边数。

这题是网格图,考虑“白点数量”$-$“$1\times 2$ 的白矩形数量”$-$“$2\times 1$ 的白矩形数量”$+$“$2\times 2$ 的白矩形数量”。

当且仅当白点包了一个环把黑点包住时会多减 $1$。

由于黑点是连通的,只有这种情况要特判。判下黑点横纵坐标最大最小值

注意到虽然网格很大,但我们只需要关心黑点旁边那一圈点,只有 $O(m)$ 个。

每一类信息都用总数减去不合法的方案数就可以了。用主席树维护矩阵信息。

复杂度 $O((m+Q)\times log(R+C))$。

 

Rikka with Consistency

2018-2019, Xuzhou Regional Contest, C

题意:

有一条折线,拐点坐标为 $(i,H_i)$。其中 $H_0=H_n=0$。

 

Rikka with Data Structures

2018-2019, Xuzhou Regional Contest, E

题意:

维护一个序列,支持:

1.区间加

2.区间赋值

3.给出 $x$ 和一个区间 $[l,r]$,问 $[l,r]$ 中有多少个 $y$,满足 $A[x...y]$ 的最大值 $=$ $\max(A[x],A[y])$。

范围:

$n,m\le 10^5$

 

题解

不妨假设 $x$ 在 $[l,r]$ 左边。如果 $x$ 在 $[l,r]$ 中只要拆成两个区间就可以了。

考虑 $[x,l]$ 中的最大值 $v$,那么从 $v$ 开始的不递减序列显然每个都合法。

如果 $v=A[x]$,那么从 $l$ 开始直到第一个 $\gt v$ 的位置

现在相当于对于一个区间 $[l,r]$,从 $v$ 开始,从左往右每次跳到下一个 $\ge$ 它的位置,求能跳几次、出来是什么。

线段树维护每个区间最大值、右区间内从左区间的最大值开始跳能跳几次、出来是什么。

询问时通过讨论 $v$ 和左区间最大值的关系就可以递归到左右。复杂度 $O(log(n))$。

 

Rikka with Sorting Networks

2018-2019, Xuzhou Regional Contest, I

题意

按顺序给出 $k$ 个排序网络的比较器 $(u,v)$,即若 $A[u]\gt A[v]$ 就交换 $u,v$。

问多少 $1\sim n$ 的排列经过这个网络之后,最长上升子序列长度至少为 $n-1$。

范围

$100$ 组数据,$n\le 50,\space k\le 10$。

 

题解

最长上升子序列长度至少为 $n-1$ 的排列只有 $O(n^2)$ 个。

排序网络本质上是如果满足一些大小关系就进行一些交换。

两个不同的排列经过排序网络,如果每次比较的结果都相同,那么出来的仍然是两个不同的排列(进行的交换相同)。

那么直接枚举最终的排列,$O(2^k)$ 枚举每个比较器的比较结果,倒着推上去看看是否会矛盾就可以了。

复杂度 $O(T n^2 2^k)$。

 

此处跳过一道插头 $dp$ 裸题($rxd$ 大佬几句话带过了)。

 

Tournament

2018-2019, Qingdao Regional Contest, F

题意

有 $n$ 个骑士,要进行 $k$ 轮决斗。每轮决斗中,每个骑士都要和另一个骑士单挑。需要满足:

1. 任意两个骑士在 $k$ 轮决斗中最多只会单挑 $1$ 次。

2. 如果对于两场决斗 $i\lt j$,在第 $i$ 场中 $A$ 和 $B$ 单挑,$C$ 和 $D$ 单挑,那么在第 $j$ 场中若 $A$ 和 $C$ 单挑,则 $B$ 必须和 $D$ 单挑。

请你给出一个字典序最小的解或输出无解。

范围

$n,k\le 1000$

 

题解

爆搜或者手玩一下,然后观察一下:

1-2 3-4 5-6 7-8

1-3 2-4 5-7 6-8

1-4 2-3 5-8 6-7

1-5 2-6 3-7 4-8

1-6 2-5 3-8 4-7

1-7 2-8 3-5 4-6

1-8 2-7 3-6 4-5

可以发现构造策略就是第 $i$ 次 $1$ 和 $i+1$ 打,然后到 $2$ 的幂次为止的值都可以由前面的信息确定出来。再往后平移一下就可以了。

由此也可以知道当且仅当 $k\ge lowbit(n)$ 时无解。

 

Counting Sheep in Ami Dongsuo

2018-2019, Shenyang Regional Contest, F

题意

有一张 $n$ 个点的拓扑图,每个点有个权值,权值不超过 $w$。

有三个人要从同一个点出发,走三条不同的路线。这种方案的权值就是他们最后停在的那三个点的权值和。

对于 $k=0\sim 30000$,问权值为 $k$ 的方案有多少种。膜 $10^9+7$。

范围

 $n\le 10000,\space m\le 30000,\space w\le 400$

 

题解

三条路线要不同的限制,只要容斥一下就行了。

考虑求从一个点出发,三个结束点权值为 $w$ 的方案数。

直接做就是个卷积,$O(mwlog(w))$。

可以把 $1\sim 3w$ 拿进去求点值,

 

Cherry and Chocolate

2018-2019, Nanjing Regional Contest, C

现在假设已经有了一个方案 $(x,y,z)$,考虑被控制的点的集合:

    - $x$ 除了 $y$ 所在子树外的所有子树

    - $y$ 的 $z$ 所在连通子图

如果 $x$ 往 $y$ 以外的方向移动,$B$ 可以保持 $y$ 不变,这样若 $z$ 是 $y$ 的父亲,答案不变,否则答案变小,对 $A$ 不利。

 

Huge Discount

2018-2019, Nanjing Regional Contest, H

题意

有一个长为 $10^5$ 的只含 $0,1,2$ 的数字串,

 

Lagrange the Chef

2018-2019, Nanjing Regional Contest, L

题意

给出 $n,X,Y$ 和 $n$ 个数 $A_i$,要通过若干次把某个数移动到

考虑如果有一对相邻的 $X,Y$,如何处理:

    - 拿一个不是 $X,Y$ 的数夹到它们中间

    - 把 $X$ 或者 $Y$ 放到别的地方去

观察第二种操作可以放到什么地方去,由于连续的一段 $X$ 和一个 $X$ 完全等价,所以显然

于是可以 $DP$ 了:$dp_{i,j,x,y,0/1/2}$ 表示考虑了前 $i$ 个数字、“用来夹到后面的 $XY$ 中间的数”减去“前面的 $XY$ 尚待用后面的数夹的”个数为 $j$,

 

Immortal ...Universe

2018-2019 ACM-ICPC, Asia East Continent Finals, E

题意

有两个长度为 $n$ 的、由 $P$ 和 $V$ 构成的序列。一个人从

题解

观察到有可能输的充要条件是存

posted @ 2019-01-26 15:32  大本营  阅读(1689)  评论(1编辑  收藏  举报