首页 > 其他分享 >[SCOI2014] 方伯伯的玉米田 题解

[SCOI2014] 方伯伯的玉米田 题解

时间:2024-08-21 21:05:55浏览次数:12  
标签:lb int 题解 玉米田 序列 区间 内比 SCOI2014 dp

对于每次修改的区间以及其左边序列和右边序列,共三种情况:

  • 1.区间内比两侧低的还是低
  • 2.区间内比两侧低的变得比两侧高了
  • 3.区间内比两侧高的还是高

那么现在又面临一个问题:在区间内变化后,对答案,即最长不下降子序列有什么影响。
对区间左边:可能会使其最长不下降子序列增长
对区间右边:可能会使其最长不下降子序列减少
综上所述:我们出正解一定要保证修改的区间右侧没有数,也就是修改区间的最后一位在 $n$ 上
然后来到最使我头疼的地方, DP 转移方程,这个简单的方程我想了好久(似乎也不是很简单)。

f[i][j] 表示以 i 结尾,被拔高了 j 次的区间之后,最长不下降子序列的长度

f[i][j]=max{f[k][l]+1(1≤k<i,0≤l≤j,h[i]+j>h[k]+l)}

然后我们用二维树状数组维护一下就好了

#include<bits/stdc++.h>
using namespace std;
#define lb(x)  (x)&(-x)
int a[10010],dp[10010][510],t[510][5510],n,k;
void update(int x,int y,int d){
	for(int i=x;i<=k+1;i+=lb(i)){
		for(int j=y;j<=5500;j+=lb(j)){
			t[i][j]=max(t[i][j],d);
		}
	}
} 
int query(int x,int y){
	int ans=0;
	for(int i=x;i>0;i-=lb(i)){
		for(int j=y;j>0;j-=lb(j)){
			ans=max(ans,t[i][j]);
		}
	}
	return ans;
}
int main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=n;i++){
		for(int j=k;j>=0;j--){
			dp[i][j]=query(j+1,a[i]+j)+1;
			update(j+1,a[i]+j,dp[i][j]);
		}
	}
	cout<<query(k+1,5500);
	return 0;
}

标签:lb,int,题解,玉米田,序列,区间,内比,SCOI2014,dp
From: https://www.cnblogs.com/mengxiaolong/p/18372536

相关文章

  • SP368 CSTREET - Cobbled streets 题解
    题意选n−1条道路连接n个城市,且使得其修建的价格最小。分析最小生成树的模板题,可以用kruskal来做。首先,先将所有的边权从小到大排序。然后,取当前没有选过的,且边权最小的边,判断它连接的两个点是否同属一个集合,如果不是就把他们加到同一个集合中,再记录答案。代码很简单,......
  • [CERC2019] ABB 题解
    题目可以转化为求最长回文子串,答案就是长度减去最长回文子串的长度。看到是求最长回文子串,一眼就容易想到马拉车。此题只需在求出回文半径的基础上储存回文串的右端点,将求出的右端点排序,只要右端点不在最后的字符就结束(不能补),如果在最后的字符就取原字符串长度与当前回文子串的差......
  • [JOISC 2023 Day3] Tourism 题解
    大家好,我喜欢珂朵莉树,所以我用珂朵莉树\(AC\)了本题。实际上,我们比较容易发现,这题实际上就是求\([l,r]\)中的所有点作为关键点时,虚树所压缩的所有点(实际上就是显现出来的点+在虚边上的点)。那么我们容易发现,一个点\(x\)作为虚树所压缩的所有点的充要条件为:\(x\)是至少......
  • 【题解】Solution Set - NOIP2024集训Day12 树上启发式合并
    【题解】SolutionSet-NOIP2024集训Day12树上启发式合并https://www.becoder.com.cn/contest/5472「CF600E」Lomsatgelral直接dsuontree。记录每一个颜色的出现次数。「IOI2011」Race之前是用点分治做的。考虑dsuontree。每个子树内维护到根节点的距离为\(x\)......
  • SP368 CSTREET - Cobbled streets 题解
    题意选n−1条道路连接n个城市,且使得其修建的价格最小。分析最小生成树的模板题,可以用kruskal来做。首先,先将所有的边权从小到大排序。然后,取当前没有选过的,且边权最小的边,判断它连接的两个点是否同属一个集合,如果不是就把他们加到同一个集合中,再记录答案。代码很简单,......
  • 莫队的 1.5 近似构造 题解
    前言题目链接:洛谷。感觉T4比T3水,虽然我都没做出来。题意简述给定\(1\simn\)的排列\(a\)和\(m\)个区间\([l_i,r_i]\)。定义值域区间\([L,R]\)的价值为\(\operatorname{val}([L,R])\operatorname{:=}\max\limits_{i=1}^m\sum\limits_{k=l_i}^{r_i}[L......
  • P10892 SDOI2024 题解
    【题意简述】你有一个数字\(n\),每次操作将\(n/2\),如果\(n\)是一个奇数,你会纠结是向上取整还是向下取整。问你最少纠结多少次。多组数据。【思路】为了方便起见,我们在二进制下重新审视这个题目:在二进制下,一个数除以\(2\)等同于右移一位。默认向下取整,因为右移会舍弃......
  • P7706 文文的摄影布置 题解
    P7706文文的摄影布置题解原题读完题,发现是线段树。单点修改+区间查询。不过查询的值有些奇怪,就是了,我们考虑用线段树维护这个ψ值(下称待求值)。对于一个区间的待求值,大概有四种情况:如上图四种情况分别为:待求值最大值在左区间待求值最大值在右区间\(a_i与b_j\)在左......
  • 一元柯西问题解法整理与试证明(傅里叶变换的应用)
    关于柯西问题:  柯西问题是指偏微分方程仅有初始条件而无边界条件的定解问题,常用特征线法、分离变量法、格林函数法以及傅里叶变换求解,柯西问题即对于  其中   为主函数, 为初始条件,求解U(x,t)关于傅里叶变换:公式:对于一维方程f(x)有    或  卷积:若,则......
  • [题解]P2444 [POI2000] 病毒
    P2444[POI2000]病毒题目核心是多模式匹配,所以考虑用对所有模式串建立AC自动机。我们把自动机上,存在一个模式串作为前缀的节点,称作“危险节点”。如果无限长的安全代码存在的话,匹配过程中Trie图上一定有节点会经过多次,即存在环;而且经过的所有节点都不是“危险节点”,否则就包含......