算重学(3) 分治
eg
分治 FFT https://www.luogu.com.cn/problem/P4721
那我定义 solve(l,r) 为求出来 \([l,r]\),那么考虑先求完左部分,然后考虑左部分对右部分的贡献,这样一定是对的?
定义 solve(l,r) 为当前只考虑 \([l,r]\) 范围内的二元组,求得 \(f[l,r]\) 的函数。
那如何给定这个定义,往往的,仅和 \([l,r]\) 有关,并结合最初调用所求的来分析,给定其定义,然后进行操作。
那么这种东西,一般只要满足调用是对的,分治下去是对的,最终就一定能满足。
调用:solve(1,n) 满足定义,满足我们所求。
分治:回顾目前的定义,仅考虑 \([l,r]\) 范围内的二元组,求得 \(f[l,r]\),考虑先求得 solve(l,mid),那么此时是不是 \(f[l,mid]\) 都求出来了,因为右部并不会对左部有贡献,因此可以通过子问题来解决。然后考虑左部对右部的贡献,然后再仅考虑右部自己本身的贡献,发现后者是右部独立的子问题,是不是对于右部而言已经满足条件,所以 \(f[mid+1,r]\) 也求出来了,综上,我们满足了定义。
虽然你可能很难理解这样为啥是对的,我也是很难理解!但我们处处都在满足定义,并将其分成子问题求解,然后再整合成当前的问题。就得到当前问题的答案了。