题面传送门 首先注意到这次行数与列数不同阶,列数只有 \(200\),而行数高达 \(5000\),因此可以考虑以行为下标建线段树,线段树上每个区间 \([l,r]\) 开一个 \(200\times 200\) 的数组 \(d_{i,j}\) 表示从 \((l,i)\) 到 \((r,j)\) 的最短路,合并暴力用类似 floyd 的方式进行转移,这样暴力时间复杂度是 \(RC^3+mC^2\log R+q\),空间复杂度 \(RC^2\),其中 \(m\) 为修改次数,一脸无法通过,而且 T…
LINK:holiday 考虑第一个subtask. 容易想到n^2暴力枚举之后再暴力计算答案. 第二个subtask 暴力枚举终点可以利用主席树快速统计答案. 第三个subtask 暴力枚举两端利用主席树计算贡献. 最后一个 subtask. 容易想到还是固定左端点来不断的寻找右端点. 不过很遗憾这最多只能做到\(n^2logn\) 需要从其他的角度入手 感觉前面几个subtask一直在迷惑选手. 可以从天数下手 左边多少天右边多少天. 显然 需要预处理出\(f1_i,f2_i\)分别表示从起…
点此看题面 大致题意: 有一棵树,给出每个叶节点的点权(互不相同),非叶节点\(x\)至多有两个子节点,且其点权有\(p_x\)的概率是子节点点权较大值,有\(1-p_x\)的概率是子节点点权较小值.假设根节点\(1\)号节点的点权有\(m\)种可能性,其中权值第\(i\)小的可能点权是\(V_i\),可能性为\(D_i\),求\(\sum_{i=1}^mi\cdot V_i\cdot D_i^2\). 前言 好妙的题目,像我这种蒟蒻根本想不到线段树合并还可以这么玩. 同时,在无数个地方漏掉\(…
遇见的第一道决策单调性优化DP,虽然看了题解,但是新技能√,很开森. 先%FlashHu大佬,反正我是看了他的题解和精美的配图才明白的,%%%巨佬. 废话不多说,看题: 题目大意 已知一个长度为n的序列a1,a2,...,an. 对于每个1<=i<=n,找到最小的非负整数p满足 对于任意的j, aj < = ai + p - sqrt(abs(i-j)) 数据范围 洛咕上也没给,我能怎么办啊 非正解做法一:暴力 应该都会吧,\(O(n^2)\)枚举.洛谷上貌似40pts. 非正解做法二:…
题意: 给定一个序列,你要将其分为k段,总的代价为每段的权值之和,求最小代价. 定义一段序列的权值为$\sum_{i = 1}^{n}{\binom{cnt_{i}}{2}}$,其中$cnt_{i}$表示当前这段序列中数字大小为i的数的个数. 题解: 先考虑暴力DP, f[i][j]表示DP到i位,分为j段的最小代价. 则$f[i][j] = min(f[l - 1][j] + sum[l][i])$,其中sum[l][i]表示区间[l, i]分成一段的代价. 然后可以发现,这是具有决策单调性的…
传送门 决策单调性优化dp板子题. 感觉队列的写法比栈好写. 所谓决策单调性优化就是每次状态转移的决策都是在向前单调递增的. 所以我们用一个记录三元组(l,r,id)(l,r,id)(l,r,id)的队列来维护,表示在(l,r)(l,r)(l,r)这个区间当前的决策都是ididid,然后在每次求决策点的时候弹一下队头,求出当前解之后我们更新一下队尾就行了. 代码: #include<bits/stdc++.h> #define N 100005 #define ld long double u…
第一种方法是决策单调性优化DP. 决策单调性是指,设i>j,若在某个位置x(x>i)上,决策i比决策j优,那么在x以后的位置上i都一定比j优. 根号函数是一个典型的具有决策单调性的函数,由于根号函数斜率递减,所以i决策的贡献的增长速度必定比j快. 于是使用基础的决策单调性优化即可. 注意两个问题,一是DP函数要存实数而不能存整数,因为先取整会丢失在后面的判断中需要的信息.二是记录决策作用区间的时候左端点要实时更新,即下面的p[st].l++,否则在二分时会出现错误. #include<c…
Description 已知一个长度为n的序列a1,a2,...,an. 对于每个1<=i<=n,找到最小的非负整数p满足 对于任意的j, aj < = ai + p - sqrt(abs(i-j)) Input 第一行n,(1<=n<=500000) 下面每行一个整数,其中第i行是ai.(0<=ai<=1000000000) Output n行,第i行表示对于i,得到的p Sample Input 6 5 3 2 4 2 4 Sample Output 2 3…
决策单调性优化dp 专题练习 优化方法总结 一.斜率优化 对于形如 \(dp[i]=dp[j]+(i-j)*(i-j)\)类型的转移方程,维护一个上凸包或者下凸包,找到切点快速求解 技法: 1.单调队列 : 在保证插入和查询的x坐标均具有单调性时可以使用 2.单调栈+二分:保证插入有单调性,不保证查询有单调性 3.分治+ 1 或 2:在每次分治时将\([l,mid]\)这段区间排序后插入,然后更新右区间\([mid+1,r]\)的答案 二.分治.单调队列维护有单调性的转移 (甚至还有分治套分治)…
update in 2019.1.21 优化了一下文中年代久远的代码 的格式…… 什么是决策单调性? 在满足决策单调性的情况下,通常决策点会形如1111112222224444445555588888..... 即不可能会出现后面点的决策点小于前面点的决策点这种情况. 那么这个性质应该如何使用呢? 1,二分. 考虑到决策点单调递增,因此我们考虑用单调队列存下当前的决策选取情况. 单调队列中存的量会带3个信息:这是哪个决策点,这个决策点会给哪个区间的点产生贡献(这是一个区间,所以算2个信息) 相当…
Description 通往贤者之塔的路上,有许多的危机. 我们可以把这个地形看做是一颗树,根节点编号为1,目标节点编号为n,其中1-n的简单路径上,编号依次递增, 在[1,n]中,一共有n个节点.我们把编号在[1,n]的叫做正确节点,[n+1,m]的叫做错误节点.一个叶子,如果是正 确节点则为正确叶子,否则称为错误叶子.莎缇拉要帮助昴到达贤者之塔,因此现在面临着存档位置设定的问题. 为了让昴成长为英雄,因此一共只有p次存档的机会,其中1和n必须存档.被莎缇拉设置为要存档的节点称为存档 位置.当…
传送门 一道神奇的dp题. 这题的决策单调性优化跟普通的不同. 首先发现这道题只跟r−lr-lr−l有关. 然后定义状态f[i][j]f[i][j]f[i][j]表示猜范围为[L,L+i−1][L,L+i-1][L,L+i−1]的数有jjj次报警机会所需的最小代价. 那么有: f[i][j]=minf[i][j]=minf[i][j]=min{max(f[k][j],f[i−k][j−1]+1)max(f[k][j],f[i-k][j-1]+1)max(f[k][j],f[i−k][j−1]+1…
题面传送门 首先一眼二分答案,我们假设距离 \((i,j)\) 最近的 scarefrog 离它的距离为 \(mn_{i,j}\),那么当我们二分到 \(mid\) 时我们显然只能经过 \(mn_{i,j}\ge mid\) 的点,如果我们已经知道了 \(mn_{i,j}\),那么检验 \(mid\) 是否可行就是一遍 BFS 能搞定的事,于是我们的目标就是求出 \(mn_{i,j}\) 即可. 故下面就有两种做法,一种是我的乱搞做法,一种是正经的做法. 乱搞做法 这就是某个奇怪的人自己发明出来…
点此看题面 大致题意: 有\(n\)家店,每个商品有一个标价.每天,都可能有某家商店进货,也可能有某人去购物.一个人在购物时,会于编号在区间\([L_i,R_i]\)的商店里挑选一件进货\(d_i\)天以内的商品使得其标价与\(x_i\)的异或值最大,同时每家店有一个特殊商品在任何时候都可以选择.对于每名购物者求出这个最大异或值. 暴力 一个很暴力的想法,就是线段树套可持久化\(Trie\)树...... 但这貌似是过不了的,因此需要优化. 线段树分治 这道题的正解是一个叫做线段树分治的神奇算法…
做的第一道斜率优化\(DP\)QwQ 原题链接1/原题链接2 首先考虑\(O(n^2)\)的做法:设\(f[i]\)表示在\(i\)处建仓库的最小费用,则有转移方程: \(f[i]=min\{f[j]+\sum\limits_{k=j+1}^{i}P[k](X[i]-X[k])\}+C[i]\) 于是我们枚举\(i\),再从\(i-1\)开始从大到小枚举\(j\),并记录一个前缀和,每次更新一下\(f[i]\).洛咕上貌似拿了66分,数据太水: #include <cstdio> using…
决策单调性: 对于一些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]Li…
LINK 题目大意 给你一个序列分成k段 每一段的代价是满足\((a_i=a_j)\)的无序数对\((i,j)\)的个数 求最小的代价 思路 首先有一个暴力dp的思路是\(dp_{i,k}=min(dp_{j,k}+calc(j+1,i))\) 然后看看怎么优化 证明一下这个DP的决策单调性: trz说可以冥想一下是对的就可以 所以我就不证了 (其实就是决策点向左移动一定不会更优) 然后就分治记录当前的处理区间和决策区间就可以啦 //Author: dream_maker #include<bi…
第一次写这种二分来优化决策单调性的问题.... 调了好久,,,各种细节问题 显然有DP方程: $f[i]=min(f[j] + qpow(abs(sum[i] - sum[j] - L - 1)));$ 其中f[i]代表到了第i个句子的最小答案 qpow用于处理^p sum为前缀和 (同时为了处理句子之间的空格问题,我们在统计前缀和的时候就默认在句子后面加一个空格, 然后在计算的时候,由于每一行只有最后一个不用加空格,直接减掉这个多加的空格即可获得正确长度) 首先我们可以打表发现是满足决策单调性…
一般的式子都是 $f_i = max\{g_j + w_{(i,j)}\}$ 然后这个 $w$ 满足决策单调性,也就是对于任意 $i < j$ ,$best_i \leq best_j$ 这样就会有两种优化方式 1.$w_{(i,j)}$ 可以快速求 例如:NOI 2009 诗人小 G 题里给了你 $L,P$ 和单调递增的 $s$ 数组,然后 $f_i = min \{ f_j + |s_i-s_j-L-1|^P \} \space (j < i)$ 可以发现以一个点为最优决策的点是一段区间…
传送门 思路: 最朴素的dp式子很好考虑:设\(dp(i,j)\)表示前\(i\)个任务,共\(j\)批的最小代价. 那么转移方程就有: \[ dp(i,j)=min\{dp(k,j-1)+(sumT_i+S*j)*(sumC_i-sumC_k)\} \] 为什么有个\(S*j\)呢,因为前面的批次启动会对后面的答案有影响. 但是分析复杂度是\(O(n^3)\)的,肯定不行. 考虑一下为什么需要第二个状态呢?是为了消除后效性,因为后面的状态不知道总共启动了几次. 但我们可以把费用提前计算,一次启…
用途 废话,当然是在DP式子满足某些性质的时候来优化复杂度-- 定义 对于\(j\)往大于\(j\)的\(i\)转移,可以表示成一个关于\(i\)的函数\(f_j(i)\),也就是\(dp_i=\max/\min\{f_j(i)\}\). 若是取\(\max\),并且在某一个地方\(f_j(i)\)从下面跑到了\(f_k(i)\)的上面(如果加入\(f_j(i)\)这个函数时本来就在\(f_k(i)\)的上面那么不算),就称之为\(j\)取代了\(k\).取\(\min\)同理. 如果满足决策单…
小Q有n本书,每本书有一个独一无二的编号,现在它们正零乱地在地上排成了一排. 小Q希望把这一排书分成恰好k段,使得每段至少有一本书,然后把每段按照现在的顺序依次放到k层书架的每一层上去.将所有书都放到书架上后,小Q这才突然意识到它们是乱序的,他只好把每一层的书分别按照编号 从小到大排序.排序每次可以在1单位时间内交换同一层上两本相邻的书. 请写一个程序,帮助小Q计算如何划分这k段,且如何交换这些书,使得总交换次数最少. Input 第一行包含两个正整数n; k(1≤n≤40000;1≤k≤min…
Description 对于一个区间集合 {A1,A2--Ak}(K>1,Ai不等于Aj(i不等于J),定义其权值 S=|A1∪A2∪--AK|*|A1∩A2--∩Ak| 即它们的交区间的长度乘上它们并区间的长度. 显然,如果这些区间没有交集则权值为0. Your Task 给定你若干互不相等的区间,选出若干区间使其权值最大. Input 第一行n表示区间的个数 接下来n行每行两个整数l r描述一个区间[l,r] Output 在一行中输出最大权值 Sample Input 4 1 6 4 8…
题目大意:给你一颗$n$个点的有根树,相邻两个点之间有距离,我们可以从$x$乘车到$x$的祖先,费用为$dis\times P[x]+Q[x]$,问你除根以外每个点到根的最小花费. 数据范围:$n≤10^6$. 此题我们显然$dp$,列出方程为$f[x]=min\{f[y]+dis(x,y)\times P[x]+Q[x]\}$,其中$y$为$x$的祖先. 不难看出可能是一个斜率优化的式子,我们往下推推 设$i$是$j$的祖先,且从$i$出转移比从$j$处转移劣,不难列出: $f[i]+dis(…
题目链接 [洛谷] [BZOJ]没有权限号嘤嘤嘤.题号:3545 题解 窝不会克鲁斯卡尔重构树怎么办??? 可以离线乱搞. 我们将所有的操作全都存下来. 为了解决小于等于\(x\)的操作,那么我们按照长度来排一个序. 如果询问和加边长度相同,这加边优先. 对于每一个连通块进行权值线段树. 权值线段树解决\(k\)大的问题. 每一次合并,并查集判联通,线段树暴力合并. 时间复杂度\(O(nlogn)\). 代码 #include <bits/stdc++.h> using namespace s…
题目链接 [洛谷] 题解 来做一下水题来掩饰ZJOI2019考炸的心情QwQ. 很明显可以线段树. 维护两个值,\(Lazy\)懒标记表示当前区间是否需要翻转,\(s\)表示区间还有多少灯是亮着的. 那么每一次翻转,\(s\)就变成了\(n-s\),\(n\)表示区间内所有灯的数量. 线段树维护一下就可以了. 代码 #include <bits/stdc++.h> using namespace std; const int N = 100000 + 6; int n, m; namespac…
点此看题面 大致题意: 有单点修改数字和区间着色两种修改操作,询问你某段区间内包含所有颜色且数字和最小的子区间的数字和,或某段区间内没有重复颜色且数字和最大的子区间的数字和.数据随机. \(ODT\)维护颜色 看到区间着色且题目中强调数据随机,容易想到使用\(ODT\)去求解. 于是,我们就可以考虑用\(ODT\)来对颜色进行维护. 线段树维护数字和 但是考虑到要求区间数字和,\(ODT\)就很难搞了. 考虑到我们其实可以对于每个询问,每次找到一个合法区间再询问数字和更新答案. 也就是说,可以把…
题解: 解法1: 单调栈优化 首先发现一个性质就是 如果当前从i转移比从j转移更加优秀 那么之后就不会从j转移 所以我们考虑利用这个性质 我们要维护一个队列保证前一个超过后一个的时间单调不减 怎么来维护呢 我们计算s[t-2]超过s[t-1]的时间t1,s[t-1]超过i的时间t2,如果t1<t2就说明了s[t-1]没有用了 另外再更新的时候我们算一下相邻两个哪个比较有用,要是前面哪个就弹栈 解法2: f[i]=max(f[j−1]+a[j]×(s[i]−s[j]+1)^2) 我们先尝试一下一般…
LINK 因为是图片题就懒得挂了 简要题意:有n个串,拼接两个串需要加一个空格,给你l和p,问你拼接后每个串的总长减l的绝对值的p次方的最小值 首先打表发现一下这题是决策单调的对于所有数据都成立就当他一定成立了 然后网上有神仙用四边形不等式证明了这个东西LINK 我就懒得不会证明了 然后考虑用一个双向的队列维护出每个决策点对应的单调区间 然后保证所有区间一定是连续的 就构成了所有dp的转移区间 其实和bzoj2216非常像 代码都差不多,直接维护就可以了 最后上DP式子: dp[i] = dp[…
LINK 懒得搬题面 简要题意:n个物品,每个物品有一个价格和一个吸引力,问你对于\(i \in [1,k]\),花费i的价格能得到的最大吸引力 其中价格的范围很小,在\([1,300]\)范围内 思路 首先想到一个dp \(dp_{i,j}\)表示用对于价格小于等于i的物品花费j的价格能得到的最大吸引力 然后对于相等的价格的物品,有一个贪心的的思想就是个数确定的时候选取最大吸引力的几个 这个可以前缀和预处理出来 然后考虑对于价格相等的时候 如果对于\(dp_{w,p}的决策点i < j\),存…