【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$ 构成的序列。一个人从
题解
观察到有可能输的充要条件是存
【WC2019笔记】IOI2018 / ACM题目选讲的更多相关文章
- ICPC题目选讲
Traveling in the grid world 题目描述 有一个 \(n\times m\) 的格点图,两点之间走他们的连线,但是这条连线不能恰好覆盖其他整点.还要求相邻两步之间的连线不能斜率 ...
- CodeChef题目选讲
https://wenku.baidu.com/view/2445a0322f60ddccda38a023.html 关键点:不超过7条 根据咕咕原理,所以答案最少是N/7;(N小于49就暴力) 随机 ...
- hwy题目选讲
\[ f(n) = n/5 + f(n/5)\\ g(n) = (n\mod10)! * g(n/5)\mod 5\\ ans = f(n)*inv(2^g(n))\\ \]
- PJ可能会用到的动态规划选讲-学习笔记
PJ可能会用到的动态规划选讲-学习笔记 by Pleiades_Antares 难度和速度全部都是按照普及组来定的咯 数位状压啥就先不讲了 这里主要提到的都是比较简单的DP 一道思维数学巧题(补昨天) ...
- PJ考试可能会用到的数学思维题选讲-自学教程-自学笔记
PJ考试可能会用到的数学思维题选讲 by Pleiades_Antares 是学弟学妹的讲义--然后一部分题目是我弄的一部分来源于洛谷用户@ 普及组的一些数学思维题,所以可能有点菜咯别怪我 OI中的数 ...
- [转载]CSP-J/S 第一轮知识点选讲
CSP-J/S 第一轮知识点选讲 转载自这里 感谢原博主的大力整理! 信息学史及基本知识 一.信息学及计算机史 计算机的顶级奖项:图灵奖.冯·诺依曼奖 图灵奖:由ACM(美国计算机协会)设立于1966 ...
- 2019暑期金华集训 Day6 杂题选讲
自闭集训 Day6 杂题选讲 CF round 469 E 发现一个数不可能取两次,因为1,1不如1,2. 发现不可能选一个数的正负,因为1,-1不如1,-2. hihoCoder挑战赛29 D 设\ ...
- 正睿OI DAY3 杂题选讲
正睿OI DAY3 杂题选讲 CodeChef MSTONES n个点,可以构造7条直线使得每个点都在直线上,找到一条直线使得上面的点最多 随机化算法,check到答案的概率为\(1/49\) \(n ...
- DP选讲
$DP$选讲直接上题吧放个题单[各省省选DP](https://www.luogu.com.cn/training/151079)$P5322[BJOI2019]$排兵布阵一眼题,考虑$dp[i][j ...
随机推荐
- JS let和const关键字
ES2015 引入了两个重要的 JavaScript 新关键词:let 和 const. Let关键字 1.用于作用域:块作用域,循环作用域,函数作用域,全局作用域, 在 ES2015 之前,Java ...
- PHP implode() 函数
转自:http://www.w3school.com.cn/php/func_string_implode.asp 语法 implode(separator,array) 参数 描述 separato ...
- vue组件-使用插槽分发内容(slot)
slot--使用插槽分发内容(位置.槽口:作用: 占个位置) 官网API: https://cn.vuejs.org/v2/guide/components.html#使用插槽分发内容 使用组件时,有 ...
- node第一天
一.主要执行的文件命名一般为main.js var aModule =require('./a.js');//相对路径 var aModule =require('a.js');//专门从node_m ...
- c++引用与指针的区别
c++引用与指针的区别 ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名. 指针的权威定义: In a declaration T D where ...
- spring data事务
事务在spring data中的使用 1:事务一般在service层.因为一个service方法可能会多次调用不同的dao,为了保证事务的完整性,那么多次的dao都放到一个方法里面 2:读的时候可以不 ...
- pycharm clion rider 注册
JetBrains 公司出品的pycharm clion rider 专业版本都需要注册才能运行,这里有个免费注册方法: JetBrains授权服务器2017.10.7授权方法:激活时选择Licens ...
- Centos7多内核情况下修改默认启动内核方法
1.1 进入grub.cfg配置文件存放目录/boot/grub2/并备份grub.cfg配置文件 [root@linux-node1 ~]# cd /boot/grub2/ [root@linux ...
- Jconsole连接Tomcat JVM
修改java虚拟机启动参数 在%TOMCAT_HOME%\bin\catalina.sh文件的最顶端 JAVA_OPTS=”-Dcom.sun.management.jmxremote.port=10 ...
- 图学java基础篇之IO
java io体系 如图可以看出,java的io按照包来划分的话可以分为三大块:io.nio.aio,但是从使用角度来看,这三块其实揉杂在一起的,下边我们先来概述下这三块: io:主要包含字符流和字节 ...