首师大附中集训第十一天:OI炼金术

正题

      今天给我们上课的老师很有趣。

      交给我们不只是一些题,还有一些题的入手方法,如何把题面转化为题解才是最重要的。

      OI选手经常遇到的痛点

      看了题解之后:啊,好简单,我咋没想到呢?

      这题我想出来了,但是那个***我不会写啊?!!!

      咦?好像有bug……an hour later)怎么还调不对啊!zbl

      决定输赢的因素

      1、把解想出来的能力

      2把程序写出来的能力

      3、把程序调对的能力

      4、乱搞能力

      5、A类加分

      把解想出来的能力

      考场上是没有题解的!!!!!考场上是没有题解的!!!!!考场上是没有题解的!!!!!

      你所有的信息来源全来自题面。所以,要利用好题面中的所有信息,包括数据范围

      例题1:BJOI 2016 空袭

      现在我军侦察兵GloryKen正在练习如何空袭打击一只“嗜血猎食者”(又称“三级狗”)。地形可以看作是N×M的网格,有些格子有障碍无法通行。在空地上有一个敌方单位“三级狗”。在接下来的一段时间内,侦察兵GloryKen将会对它进行若干次空袭。具体过程可以按回合制来描述。三级狗的初始位置在坐标(x,y),面向上下左右的某个方向。每个回合由如下几个阶段组成。

1. GloryKen发出一次“空袭指示”,友军空中支援部队立即发射一枚导弹。这颗导弹将会在ai个回合之后命中三级狗当前位置前方ai格的格子(这里的“前方”是指三级狗当前面向的方向。)。如果这个位置在地图外,那么此次空袭失效。

2. 三级狗进行一次“移动”。它可以向上下左右移动一格(不能越界,也不能到达有障碍存在的格子),也可以选择呆在当前的格子。如果进行移动,它的朝向将会变为移动的方向,否则它的朝向不变。

3. 之前所有预定于该回合到达的导弹全部同时到达在预定的位置,如果三级狗被导弹命中,它将立即死亡。导弹不会对地形造成影响,即不会破坏障碍,也不会制造障碍。

现在,GloryKen想知道,T个回合的空袭之后,如果这只三级狗还存活,它的位置可能在哪里。于是,你需要求出,对于每一个格子,这只三级狗有多少种方案能够在第T回合恰好到达这个格子,并且存活。两个方案不同,当且仅当某个回合三级狗的移动选择不同。

N,M20T50ai12

      分析过程:

      1、求方案数àDP

      2、所有数据范围都超级小à都能记到数组里-有比较大的构造空间

      3ai个回合之后命中三级狗当前位置前方ai格的格子-只要拐一个弯或者停一回合,这颗导弹就废了-只需要记当前还能直走多少步就好了

      4、将其他显然的关键信息加入DP数组(位置坐标,回合数,朝向)、得到最终解法-一个五维大DP

      例题2:NOIP2017 逛公园

      给一个N个点,M条边的有向带权图,问长度为起始点间最短路径长度+K的路径条数,答案对P取模

      N100000 M200000 K50

      分析过程:

      数方案数-DP

      绝对路径长度太大了,记不到数组里-改成相对于最短路的路径增量

      答案无穷大-不是DAG的时候

      例题3:NOI2018 冒泡排序

      冒泡排序的下界是\frac{1}{2}\sum|i-p_i| ,给出一个长度为n的排列q,问字典序严格大于q的排列中,冒泡排序交换次数等于下界的排列个数。

      第一眼看到计数-数位Dp

      下界代表了每一个位置只能想目标位置移动,不能有一步是费的,也就是说,在排序的过程中,不存在一个点向左走了一步再向右走了一步。

      而且我们知道,一个点向左走当且仅当左边有比它大的。向右走当且仅当右边有比它小的,所以限制条件就很显然了,对于一个点,不能同时比左边大比右边小。

      所以当前点在剩下的数字中要么取最小的,要么取比左边大的。

      然后数位DP转移方案就可以了。

      第三题:NOI2016 区间

      给出若干个区间[L_i.R_i],从中选出m个区间,使其交集不为空,问所有方案中,被选中的最长区间长度减去被选中的最短区间长度最小是多少?

      可以直接按长度排序,然后Two_Pointer扫一遍,加入一个区间时开一个线段树记录一下,然后如果线段树内的最大值==m那么就存在一个解,直接把左端点不断往右移直到不存在m就可以了。

      考虑怎么想出题解的:区间只有两个东西,一个是区间的位置,一个是区间的长度,分别考虑一下就可以了。

      小节

      在不能把题目一眼秒掉的情况下(能一眼秒通常是经典模型,NOI肯定不会靠这部分内容决胜负),结合学过的知识,冷静地分析所有题目中出现的元素可以比较稳定地获得答案。平时练习多注意每一道没有想出来的题最终推出答案的要素,在看题解的过程中思考这个解法是怎么想到的。理论上可以在同等知识水平的前提下使自己的奖牌提高一个档次,此为OI炼金术(俗称思维能力)。

      把程序写出来的能力&把程序调对的能力

      多熟悉板子

      把代码模块化(写到结构体里)

      10分钟内熟练地写出各种你学过的数据结构

      把学过的东西写出来也是很关键的,时常去复习复习一些板子,比赛的时候有大用。

猜你喜欢

转载自blog.csdn.net/Deep_Kevin/article/details/98095018