LINK:修改 题面就不放了 大致说一下做法.不愧是dls出的题 以前没见过这种类型的 不过还是自己dp的时候写丑了. 从这道题中得到一个结论 dp方程要写的优美一点 不过写的过丑 优化都优化不了. 容易想到 f[i][j]表示前i个数最大值为aj的最大收益. 那么有\(j<=a_i,f[i][j]=f[i-1][k]-a_i+j+b_i.j>a_i,f[i][j]=f[i-1][j]\) 值得注意的是这个转移不完全 在第二个转移的式子中 决策不全面 强行利用f[i][j] 的单调性进行覆盖…
容易想到二分. 看到第一个条件容易想到缩点. 第二个条件自然是分段 然后让总和最小 容易想到dp. 缩点为先:我是采用了取了一个前缀最小值数组 二分+并查集缩点 当然也是可以直接采用 其他的奇奇怪怪的做法. 二分为重 发现变成了dp使得总a值尽可能小的问题. 方程为 f[i]=min(f[j]+max(j+1~i)a[k]); 这个问题容易使用线段树优化dp来解决. 单调栈维护决策区间修改即可.不过被卡常了 只有90points const int MAXN=100010; ll n,m,top…
D. The Bakery time limit per test 2.5 seconds memory limit per test 256 megabytes input standard input output standard output Some time ago Slastyona the Sweetmaid decided to open her own bakery! She bought required ingredients and a wonder-oven whic…
BZOJ2090: [Poi2010]Monotonicity 2[线段树优化DP] Description 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k]. 选出一个长度为L的子序列(不要求连续),要求这个子序列的第i项和第i+1项的的大小关系为s[(i-1)mod K+1]. 求出L的最大值. Input 第一行两个正整数,分别表示N和K (N, K <= 500,000). 第二行给出N个正整数,第i个正整数表示a[i] (a[i] <= 10^…
思路 模意义 这题真tm有意思 我上下楼梯了半天做出来的qwq 首先,考虑到每K分钟有一辆车,那么可以把所有的操作都放到模$K$意义下进行 这时,我们只需要考虑两边的两辆车就好了. 定义一些称呼: 上行:从$0$~$n$的车 下行:从$n$~$0$的车 定义数组: $p[i](i=0...n)$表示上行车在站台$i$的停车时长 $q[i](i=0...n)$表示下行车在站台$i$的停车时长 $a[i](i=0...n-1)$表示第$i$的站台与第$i+1$个站台中间的行驶时间(也就是题目给定的数…
题目描述 Just like humans enjoy playing the game of Hopscotch, Farmer John's cows have invented a variant of the game for themselves to play. Being played by clumsy animals weighing nearly a ton, Cow Hopscotch almost always ends in disaster, but this has…
题目大意:给你很多条线段,开头结尾是$[l,r]$,让你覆盖整个区间$[1,T]$,求最少的线段数 题目传送门 线段树优化$DP$裸题.. 先去掉所有能被其他线段包含的线段,这种线段一定不在最优解里 排序,让所有线段构成左右端点位置都递增的排列 定义$f[i]$表示第$i$条线段,覆盖到第$i$条线段右端点时,需要的最少的线段数 $f[i]=min(f[j]+1)\;(j<i,r[j]>=l[i])$ 朴素是$n^2$转移的 开一棵最小值线段树,记录从$1$覆盖到位置$x$的最少线段数 每次求…
正解:线段树优化$dp$ 解题报告: 传送门$QwQ$ 难受阿,,,本来想做考试题的,我还造了个精妙无比的题面,然后今天讲$dp$的时候被讲到了$kk$ 先考虑暴力$dp$?就设$f_{i,j}$表示选的第$j$个基站是$i$的最小费用,就有$f_{i,j}=min(f_{k,j}+cost(k,i))+c_i$,这个$cost$就$[k+1,i-1]$之间所有基站的补偿之和. 发现这个$cost$并不好求?于是逆向思考,每次在决策完选$x$转移完之后就会进入不选$x$的阶段嘛(因为是,$j$在…
D - The Bakery CodeForces - 834D 这个题目好难啊,我理解了好久,都没有怎么理解好, 这种线段树优化dp,感觉还是很难的. 直接说思路吧,说不清楚就看代码吧. 这个题目转移方程还是很好写的, dp[i][j]表示前面 i 个蛋糕 分成了 j 个数字的最大价值. dp[i][j]=max(dp[k][j-1]+val[k+1~i]) 显而易见的是,这个肯定不可以直接暴力求,所以就要用到线段树优化. 线段树怎么优化呢, 先看这个问题,给你一个点 x ,问你以这个点为右端…
Codeforces 题面传送门 & 洛谷题面传送门 学 whk 时比较无聊开了道题做做发现是道神题( 介绍一种不太一样的做法,不观察出决策单调性也可以做. 首先一个很 trivial 的 observation 是,如果 \(2^{k-1}>n\)​ 那么答案就是 \(n\)​,因为我们可以第 \(i\) 段放 \(2^{i-1}\) 个数(最后一段除外),这样每一段中,肯定只有形如 \((x,x)\) 的整数对会产生贡献,这样答案刚好取到下界 \(n\). 我们设 \(dp_{i,j}\…
2021.12.08 P1848 [USACO12OPEN]Bookshelf G(线段树优化DP) https://www.luogu.com.cn/problem/P1848 题意: 当农夫约翰闲的没事干的时候,他喜欢坐下来看书.多年过去,他已经收集了 N 本书 (1 <= N <= 100,000), 他想造一个新的书架来装所有书. 每本书 i 都有宽度 W(i) 和高度 H(i).书需要按顺序添加到一组书架上:比如说,第一层架子应该包含书籍1 ... k,第二层架子应该以第k + 1本…
题目传送门(内部题89) 输入格式 第一行两个数$n$和$k$,分别表示小鸟的只数和$R$装弹时间.接下来$n$行,每行两个数$l,r$表示$n$只小鸟初始时的头和尾的$x$坐标. 输出格式 输出一个答案表示$R$最多能得到多少只猎物. 样例 样例输入: 4 5-1 12 45 96 8 样例输出: 数据范围与提示 对于$30\%$的数据:$n\leqslant 20,\max(|l|,|r|)\leqslant 100$.对于$60\%$的数据:$n\leqslant 5,000,\max(|…
题目传送门(内部题96) 输入格式 第一行一个整数$n$,接下来$n$行每行三个整数$a_i,b_i,w_i$. 输出格式 一行一个整数表示最大权值和. 样例 样例输入: 54 4 12 3 31 5 14 2 25 2 3 样例输出: 数据范围与提示 对于$10\%$的数据,$n\leqslant 8$. 对于$40\%$的数据,$n\leqslant 200$. 对于$70\%$的数据,$n\leqslant 3,000$. 对于$100\%$的数据,$1\leqslant n\leqsla…
传送门 线段树优化dpdpdp入门题. 要求把nnn个数分成kkk段,每段价值为里面不相同的数的个数,求所有段的价值之和最大值.n≤35000,k≤50n\le35000,k\le50n≤35000,k≤50 先考虑直接暴力dpdpdp,fj,if_{j,i}fj,i​表示把前iii个分成jjj组的最优值. 显然fj,i=max⁡j−1≤k≤i−1{fj−1,k+W(k+1,i)}f_{j,i}=\max\limits_{j-1\le k\le i-1}\{f_{j-1,k}+W(k+1,i)\…
传送门 二分出每个点不需要付www贡献的范围,然后可以推出转移式子: f[i][j]=f[i−1][k]+value(k+1,j)+c[i]f[i][j]=f[i-1][k]+value(k+1,j)+c[i]f[i][j]=f[i−1][k]+value(k+1,j)+c[i],把c[i]c[i]c[i]提出来发现前面的可以用线段树优化转移. 于是每次选一个数相当于区间加,再维护一个区间查询最小值转移就行了. 代码: #include<bits/stdc++.h> #define lc (p…
题目链接 and 题目大意 hdu3698 但是 hdu的数据比较弱,所以在这luogu提交吧UVA1490 Let the light guide us 有一个\(n*m\)的平原,要求每行选一个点,选\(n\)个点建造塔楼. 平原上每个点都有他自己的花费时间和魔法值. 为了正确控制塔楼,我们必须保证连续两排的每两座塔共用一个共同的魔法区域. 也就是要求每两行相邻的点都满足如下关系: 如果第\(i\)行选\(j\),第\(i+1\)行选\(k\),则需\(|j-k|≤f(i,j)+f(i+1,…
Some time ago Slastyona the Sweetmaid decided to open her own bakery! She bought required ingredients and a wonder-oven which can bake several types of cakes, and opened the bakery. Soon the expenses started to overcome the income, so Slastyona decid…
 先写出朴素的DP方程f[i][j]=f[k][j-1]+h[k+1][i] {k<i}(h表示[k+1,j]有几个不同的数)  显然时间空间复杂度都无法承受   仔细想想可以发现对于一个点 i 从 k 转移了,证明了 1~k 中 k 一定是最优的,不论对于i或者i之后的任何点x都是如此,不存在对i最优但对i之后的任何点x更优,否则i也可以更优(因为只多了一段h[i+1][x](i<x),而这一段显然是相同的),其实打表也能看出来(orz CYC!) 证明: 假设a<b,k>l,a…
#426 Div2 D 题意 给出 \(n\) 个数字,将这些数字隔成 \(k\) 个部分(相对位置不变),统计每个部分有几个不同数字,然后全部加起来求和,问和最大是多少. 分析 很容易想到 \(DP\) 方程,\(dp[i][j] = max(dp[i][j], dp[k][j - 1] + size(k + 1, i)\) ,\(k < i\) ,\(dp[i][j]\) 表示将 \([1, i]\) 分成 \(j\) 个部分时的答案,\(size(k+1, i)\) 表示区间 \([k+1…
降临 选定点i会有代价\(c_i\),如果一个区间j内的点全被选择,就可以获得回报\(p_j\).点数和区间个数\(<1e5\). 还以为是线段树优化网络流(50万个点200万条边看上去很可做的样子毕竟lbn说过网络流20万万条边完全没问题),没想到是个线段树dp. (虽然这两个线段树完全扯不上关系) 用\(f[i][j]\)表示考虑到第i个点,向左最近的尚未选定的点为j时的最大值.那么,i+1可以选也可以不选.不选i时,\(f[i][j]\rightarrow f[i+1][i+1]\).选i…
我们预处理出来以i为结尾的最长回文后缀(回文自动机的构建过程中就可以求出)然后就是一个区间覆盖,因为我懒得写贪心,就写了线段树优化的DP. #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; const int N=101010; const int INF=1e9; int L…
Hdu6606 Distribution of books 题意 把一段连续的数字分成k段,不能有空段且段和段之间不能有间隔,但是可以舍去一部分后缀数字,求\(min(max((\sum ai ))\)其中\(\sum ai\)为一段的数字和 分析 最小化最大值问题通常我们要想到二分,所以答案的求法我们就解决了,但是二分我们怎么check呢?这个时候一点思路都没有,我们考虑暴力的算法,设dp[i]表示从1--i最多可以分成多少段,怎么转移,什么情况下可以转移呢? 显然\(dp[i]=max(dp…
Codeforces 834D The Bakery LINK 题目大意是给你一个长度为n的序列分成k段,每一段的贡献是这一段中不同的数的个数,求最大贡献 是第一次做线段树维护DP值的题 感觉还可以,虽然看了一下这题是用线段树维护DP值 然后说思路 有一个很显然的思路是这样的: dpi,j表示前i个数分成j段的最大贡献 dpi,j=max(dpk,j−1+calc(k+1,i)) 然后我们就可以对于每一层j用线段树维护起来 然后就非常愉快地发现dp[i][p]只会从dp[i−1][p−1]之前的…
题目性质比较显然,相同颜色联通块可以合并成一个点,重新建树后,发现相邻两个点的颜色一定是不一样的. 然后发现,对于一条链来说,每次把一个点反色,实际上使点数少了2个.如下图 而如果一条链上面有分支,也是一样: 所以我们实际上只需要把最长链上的变成一种颜色就可以了.最长链就是直径,需要改动的点就是$\frac{tot+1}{2}$,$tot$就是直径的点数. (话说$stl$好慢aaa!!!要克制住我自己少用$map$叻! #include<iostream> #include<cstdi…
$m$的数据范围看起来非常有问题??仔细多列几个例子可以发现,在$m<=5$的时候,只要找到有两行状态按位$&$起来等于$0$,就是可行方案,如果没有就不行. #include<iostream> #include<cstdio> #include<cstring> using namespace std; <<+], n, m; int main ( ) { freopen ( "prob.in", "r&quo…
LINK:T1 算是一道中档题 考试的时候脑残了 不仅没写优化 连暴力都打挂了. 容易发现一个性质 那就是同一格子不会被两种以上的颜色染.(颜色就三种. 通过这个性质就可以进行dp了.先按照左端点排序. 设f[i]表示前i个画笔必选的最大价值. 枚举决策j 分类讨论相交还是包含 还是相离. 其中包含的情况没必要讨论 相交需要比对一下颜色再进行转移 不过我写的时候多打一个东西导致爆零. 值得一提的是 对于相交的情况 相交的部分不会被之前转移的线段给交上去 可以证明这样不是最优的. 所以这样dp是正…
传送门 题意 有 $ n $ 个村庄在一排直线上,现在要建造不超过 $ K $ 个通讯基站,基站只能造在村庄处. 第 $ i $ 个村庄距离第 $ 1 $ 个村庄的距离为 $ D_i $ .在此建造基站的费用为 $ C_i $ .如果在此不超过 $ S_i $ 的范围内有基站,那么这个村庄就被覆盖了.如果它没有被覆盖,则需要花费 $ W_i $ 的补偿费用. 问你最小总花费是多少. 题解 首先有一个很显然的dp: $ dp[i][j] $ 表示在第 $ i $ 个村庄建了基站,此时一共建了 $…
Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4715   Accepted: 1590 Description Farmer John's cows, pampered since birth, have reached new heights of fastidiousness. They now require their barn to be immaculate. Farmer…
题目链接:http://codevs.cn/problem/3342/ 题解: 最小化最大值:二分 二分最长空题段 令f[i]表示抄第i道题所花费的最小时间 状态转移方程:f[i]=min(f[j])+time[i]    max(0,i-mid-1)<=j<=i-1 #include<cstdio> #include<cstring> #include<algorithm> #define N 50001 using namespace std; int…
题面 思路概述 首先,不难想到本题可以用动态规划来解,这里就省略是如何想到动态规划的了. 转移方程 f[i]=min(f[j]+1)(max(i-m,0)<=j<i 且j符合士兵限定) 注意要用 max(i-m,0)以防止越界 我们先用两个数组sl,sa分别统计1~i个士兵中有多少个Lencer和Archer 然后在max(i-m,0)中寻找符合条件的j (1).两种士兵相差不超过k. 这个好说abs((sl[i]-sl[j])-(sa[i]-sa[j]))<=k 不要忘了第二种情况!!…