NOIP 2013 提高组题解 【附AC代码】

这篇博客是关于2013年NOIP提高组比赛的题解,作者详细分析了Day1和Day2的四道题目,包括求逆序对、最小边权最大值问题、贪心算法解决积木问题和解决棋盘移动问题的策略。每道题目都给出了相应的算法思路和时间复杂度,并附有部分代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       NOIP2013很恶心地只得了365分,发挥不是很好,虽然在重庆这种弱省也可以拿一等奖了,但是重庆省选是要算NOIP成绩的,于是很伤心。但是再大的挫折也还是要走过去的,更何况省选还有机会,便有了这篇总结&&题解。

(代码见最后)

【Day1】


【T1】:

直接二分快速幂取模就过了。

时间复杂度O(logK)


【T2】:

求逆序对


然后,要原式最小的话,就要后面剪的那一坨最大。

很容易知道要那一坨最大的话,要小的数乘小的数,大的数乘大的数。(由排序不等式得)

那么算法就很简单了:

    1.对于数列a,b先离散化,将他们值替换为他们在所在数列的排名。

    2.算出a中每个数应该在b中的位置。

    3.对这个位置求一次逆序对。

时间复杂度O(N*logN)


【T3】

模型简化为:给出一个节点数为N,边数为M的无向带权图。Q次询问,每次询问两个点间路径中最小边权的最大值。

很容易能够想到,先对原图求一次最大生成树,得到一个森林。在这个森林中,任意两点间,要么不连通,要么有唯一路径。

而这个唯一路径中的最小边,就是最大的最小边。(这是显然的,因为我们是从大边开始选的。)

那么现在的问题就是对于每次询问,如何快速求出答案。

LCA!!

我们添加一个虚拟节点,这个节点对每个生成树连边,然后以这个点为root进行深搜遍历,得到一颗树。那么任意两点间的最小边权,用一个倍增的LCA就搞定了。

时间复杂度O(M*logM+Q*logN)


【Day2】


【T1】

很容易由贪心想到,对于每个联通块(这里联通块的含义是:最大的连续的一段积木,且中间没有高度为0的),找出最矮的一个。然后一次将这个联通块的高度全部减去这个高度,答案自然也加上这个高度。

但这样的复杂度是O(N^2)的,不能承受这么大的数据范围。

于是我们可以基于这个贪心原则,这样考虑:对于i,如果i的高度小于i-1的高度,那么我们在减去i-1的同时,一定可以减去i。

于是我们定义一个数组f[i],表示到i这个点花费了多少代价。

f[i]=f[i-1] (h[i]<=h[i-1])

而如果i的高度比i-1的高度大,那么我们在减去i-1之后,还必须额外付出(h[i]-h[i-1])的代价。

f[i]=f[i-1]+h[i]-h[i-1] (h[

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值