单调性

决策单调性优化dp

匿名 (未验证) 提交于 2019-12-03 00:43:02
决策单调性: 对于一些dp方程,经过一系列的猜想和证明,可以得出,所有取的最优解的转移点(即决策点)位置是单调递增的。 即:假设f[i]=min(f[j]+b[j]) (j<i) 并且,对于任意f[i]的决策点g[i],总有f[i+1]的决策点g[i+1]>=g[i](或者<=g[i]) 那么,这个方程就具备决策单调性。 这个有什么用吗? 不懂具体优化方法的话确实也没有什么用。可能还是n^2的。只不过范围可能少了一些。 经典入门例题: Description: [POI2011]Lightning Conductor 已知一个长度为n的序列a1,a2,...,an。 对于每个1<=i<=n,找到最小的非负整数p满足 对于任意的j, aj < = ai + p - sqrt(abs(i-j)) Solution: 题目转化一下:就是对于每个i,找到aj+sqrt(abs(i-j))的最大值。 首先必须要先证明决策单调性: 当i>j时,即aj+sqrt(i-j)<=ai 假设对于i位置的决策点为g[i],那么对于任意的正数k,满足a[g[i]-k] + sqrt(i-g[i]+k) <= a[g[i]] + sqrt(i-g[i]) 当i变成i+1 的时候, 因为幂函y = sqrt(x)是下凸的, 因为i-g[i]+k < i-g[i] 所以, sqrt(i+1-g[i]+k)-

CSPS模拟 93

↘锁芯ラ 提交于 2019-12-02 21:24:15
    恰饭的时候lsc说我颓颓废废是要ak的前兆     所以我rp掉光了=。=     T1       思维一片混乱     T2       只会n^3       发现决策单调性,但没想全       只知道$determin(l,r)>=determin(l,r-1)$,不知道$determin(l,r)<=determin(l+1,r)$       然后只优化了下界,T50..       颓了题解,深感决策单调性之神奇       优化了一下上界,结果直接又加了50..       多想想OAO决策单调性是有两种的       复杂度很好证。     T3       分治消元。       分的是元,也是方程。       如果只分元,消哪个方程任意的话,       就会「数据删除」       至于为什么会「数据删除」       我认为他的具体原因在于「数据删除」       综上,消第i个元时必须使用第i个方程。       于是只要再「数据删除」一下,这题就可以通过。       注意,当消完[l,mid]区间递归[mid+1,r]之后,[mid+1,r]的一切操作不可与[l,mid]有关。       只有结尾回带的时候才会遍历整个矩阵。 来源: https://www.cnblogs.com/yxsplayxs/p/11762915.html

决策单调性优化dp 专题练习

牧云@^-^@ 提交于 2019-12-02 11:43:13
决策单调性优化dp 专题练习 优化方法总结 一、斜率优化 对于形如 \(dp[i]=dp[j]+(i-j)*(i-j)\) 类型的转移方程,维护一个上凸包或者下凸包,找到切点快速求解 技法: 1.单调队列 : 在保证插入和查询的x坐标均具有单调性时可以使用 2.单调栈+二分:保证插入有单调性,不保证查询有单调性 3.分治+ 1 或 2:在每次分治时将 \([l,mid]\) 这段区间排序后插入,然后更新右区间 \([mid+1,r]\) 的答案 二.分治、单调队列维护有单调性的转移 (甚至还有分治套分治) 分治法介绍: 定义函数 \(Solve(l1,r1,l2,r2)\) 记录当前分治到被转移的区间是 \(l1,r1\) ,用来更新的区间是 \([l2,r2]\) 枚举找到 \(mid\) 的决策点,根据单调性将 \([l2,r2]\) 分成两段,递归进行 复杂度上,每一个递归层的 \([l1,r1]\) , \([l2,r2]\) 都分别构成近似一整段[1,n]的区间,最多只有 \(log n\) 层,所以复杂度是 \(nlogn\) 三.四边形不等式优化 传送门 练习 一、斜率优化 另一篇总结 Extra A:柠檬 题解传送门 Extra B :牛学校 题解传送门 二、单调性优化 A: Lawrence 题解传送门 B: Lightning Conductor 题解传送门 C

期望单调性

帅比萌擦擦* 提交于 2019-12-01 10:19:53
正睿OJ 石子 满分做法: 本题应用了期望的线性性:E(x+y)= E(x)+ E(y)。取走第一堆石子期望其实就是它之前的石堆数+1。这时我们的问题就转化为求取走第一堆之前的期望长度。 令Pi表示第 i 堆石子在第 1 堆之前被取走的概率,因为它只跟第一堆的相对位置有关,所以它的值就是为 \(\frac{a[i]}{a[1]+a[i]}\) ,最后的期望长度就是他们相加。 ans= \(\sum_{i=2}^{n}\frac{a[i]}{a[1]+a[i]}+1\) 。 #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<cmath> #include<queue> #include<vector> using namespace std; typedef long long ll; const int maxm=1e5+7; int n; int a[maxm]; double ans=0; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); ans=1.0; for(int i=2;i<=n;i++) ans+=(double)a[i]/(double)(a[1]+a[i]);

[NOIP2016]蚯蚓(单调性乱搞)

一曲冷凌霜 提交于 2019-11-27 05:36:34
题目 链接 思路 最简单的思路肯定就是直接用堆维护,每次取最大的那一个,切成两截扔回堆里面(至于所有蚯蚓加上 \(q\) ,可以看做是新生成的蚯蚓减去 \(time*q\) ,最后再加回去即可,其中 \(time\) 即第几秒),然而这样子做是 \(O(n+m)log(n+m)\) 的,过不了 分析后可以发现单调性,即如果把切出来的两部分分别放到一个数组里面,它们分别单调递减 证明也很简单,设先切的蚯蚓长度为 \(len1\) ,后切的在切 \(len1\) 的这个时候长度为 \(len2\) ,那么有 \(len2\) \(\leq\) \(len1\) ,它们长度不增长的时间仅仅是切的时候,即它们的增加量相等,那么有 \(len2+c\) \(\leq\) \(len1+c\) 恒成立 所以把它们分成三个数组(队列),分别存初始蚯蚓、(切了一刀之后)第一节、第二节,对初始蚯蚓排序可以使第一个数组从大到小排序,将后切出来的蚯蚓放到队列后面可以使得这两个数组也满足从大到小排序,取最大的蚯蚓即从三个队列的队头取最大值 对于第二问,将三个队列进行归并排序即可 时间复杂度为 \(O(nlogn+m)\) #include<bits/stdc++.h> #define N 100005 #define M 7000005 using namespace std; int n,m,q,u,v

【学习笔记】动态规划—各种 DP 优化

雨燕双飞 提交于 2019-11-26 09:20:18
【学习笔记】动态规划—各种 DP 优化 【大前言】 个人认为贪心, \(dp\) 是最难的,每次遇到题完全不知道该怎么办,看了题解后又瞬间恍然大悟(TAT)。这篇文章也是花了我差不多一个月时间才全部完成。 【进入正题】 用动态规划解决问题具有 空间耗费大 、 时间效率高 的特点,但也会有时间效率不能满足要求的时候,如果算法有可以优化的余地,就可以考虑时间效率的优化。 【DP 时间复杂度的分析】 \(DP\) 高时间效率的关键在于它减少了“ 冗余 ”,即不必要的计算或重复计算部分,算法的冗余程度是决定算法效率的关键。而动态规划就是在将问题规模不断缩小的同时,记录已经求解过的子问题的解,充分利用求解结果,避免了反复求解同一子问题的现象,从而减少“ 冗余 ”。 但是,一个动态规划问题很难做到完全消除“ 冗余 ”。 下面给出动态规划时间复杂度的决定因素: 时间复杂度 \(=\) 状态总数 \(×\) 每个状态转移的状态数 \(×\) 每次状态转移的时间 【DP 优化思路】 一:减少状态总数 \((1).\) 改进状态表示 \((2).\) 选择适当的规划方向 二:减少每个状态转移的状态数 \((1).\) 四边形不等式和决策的单调性 \((2).\) 决策量的优化 \((3).\) 合理组织状态 \((4).\) 细化状态转移 三:减少状态转移的时间 \((1).\) 减少决策时间 \(