码迷,mamicode.com
首页 > 其他好文 > 详细

Farmer John 提高题单の题解

时间:2021-05-24 10:43:44      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:john   并且   为什么   离散化   影响   分配   求和   mes   改变   

P3606 : 二分 + 一元二次方程

首先想到单调性上二分,那么可以设 \(t_i\) 表示每一层增加一头牛时间的改变量。
那么 \(t_i=a_i \div [c_i\times(c_i+1)]\)

由于每一个之间二分的 \(t_i\) 实际上都差不多,所以不用去管哪个是哪个的 \(t_i\)
然后直接二分,并且移项通过 \(t_i\) 反解出 \(c_i\) 即可。

但是最后算出来统计完和之后还要减掉多的贡献,因为显然是贪心求解,那么显然均匀分配才是最优解,剩下的懒牛只要减掉乘以 \(t_i\) 的积就可以了。

Code : Here


P3608 : 树状数组 + 前缀和与单调性思想

首先可以想到有关前缀和的东西。

然后我们就可以通过离散化来求出每一个数在原数组中从大到小排序之后的排序后的位置 \(v_i\),求出位置之后由于是按照原来在数组内的顺序来一一枚举的,所以也就是说当前求出的左边的比这个位置 \(v_i\) 大的个数也就是在位置 \(v_i\) 前面所有枚举过的点。

为什么呢?这里讲得很抽象。

由于现在有原本输入的顺序为下标,权值为从大到小排序之后所处的位置的 \(v_i\)

那么我们在枚举 \(i\) 的时候,在计算所有比 \(v_i\) 的权值大的左边的位置的个数的时候,也就只要树状数组统计当前 \(<v_i\) 的权值中有多少被标记过。

为什么是对的呢?

因为这里只有前面影响后面,但是后面不影响前面,也就是说后面的比它大的全部都不会在当前被统计,反之,前面所有比它大的全部都会被统计。

从而我们计算的个数也就是对的,因为比它大的全部都会排在它前面,所以只要树状数组求和就可以了。

Code : Here


P3609 : DP

很显然我们可以直接暴力 DP 求解,就是弄三维,第一维就是当前的位置,第二维就是当前使用了多少次变换手势,然后第三维就直接是变换成什么手势,直接 DP[N][30][3] 就可以解决了。

然后很显然有一个东西就是 \(i\) 只会由 \(i-1\) 推过来,所以直接 \(O(NK)\) 的时间复杂度就可以求解了。

方程大概就是由自己的前一个(也就是不变手势),以及另外两种手势的前一个来取 \(\max\),然后加上表示 自己现在的手势是否会赢这一局 的数组的当前位即可求解了。

三个 [0],[1],[2] 随便枚举就好了。

Code : Here


P3610 : BFS

显然的六维大暴力 BFS,Code : Here


P3656 : 逆序对 + 树状数组

那么这道题可以类似逆序对一样处理。

就是先在 \(b\) 里面找到 \(a\) 的每个元素在其内的位置,然后每次把最后的移到前面去求贡献就可以了。

Code : Here

Farmer John 提高题单の题解

标签:john   并且   为什么   离散化   影响   分配   求和   mes   改变   

原文地址:https://www.cnblogs.com/lbn233/p/List1-Sol.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!