[bzoj 3594] [Scoi2014]方伯伯的玉米田
[bzoj 3594] [Scoi2014]方伯伯的玉米田
Description
方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美。
这排玉米一共有N株,它们的高度参差不齐。
方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感的玉米拔除掉,使得剩下的玉米的高度构成一个单调不下降序列。
方伯伯可以选择一个区间,把这个区间的玉米全部拔高1单位高度,他可以进行最多K次这样的操作。拔玉米则可以随意选择一个集合的玉米拔掉。
问能最多剩多少株玉米,来构成一排美丽的玉米。
Input
第1行包含2个整数n,K,分别表示这排玉米的数目以及最多可进行多少次操作。
第2行包含n个整数,第i个数表示这排玉米,从左到右第i株玉米的高度ai。
Output
输出1个整数,最多剩下的玉米数。
Sample Input
3 1
2 1 3
Sample Output
3
HINT
1 < N < 10000,1 < K ≤ 500,1 ≤ ai ≤5000
题目大概就是让你最多对一段区间进行加+1s(滑稽)的操作,最多k次,让你求LIS.然后我们容易发现每一次操作应当右端点要在n上,因为如果不在n上可能会减小答案,而在n上至少不会破坏原有的答案.
我们设f[i][j]表示前i个数上升j次所得到的LIS最大值.那么
f[i][j]=max{f[k][l]}+1 1<=k<i A[k]+l<=A[i]+j(保证上升后A[i]>=A[k])
f[i][j]=max{f[k][j+A[i]-A[k]]}+1 j<=i A[k]<=A[i]
由于是二维的,又是取max,我们可以用二维树状数组维护f的max.具体怎么维护呢?用树状数组记录第一维表示高度val,第二维表示操作次数.只要在这里面找一个max更新就可以了.最后循环顺序注意是倒序,原理和01背包差不多.树状数组下标不能为0,强行+1s处理.
#include <cstdio>
#include <algorithm>static const int maxm=1e6+10;int tr[6000+5][500+5],A[maxm];
int n,m,Max_val,ans;inline void read(int &in){in=0;char ch=getchar();for(;ch<'0'||ch>'9';ch=getchar());for(;ch>='0'&&ch<='9';ch=getchar())in=in*10+ch-'0';
}int lowbit(int x){return x&-x;
}void Add(int x,int y,int val){for(int i=x;i<=Max_val+m;i+=lowbit(i))for(int j=y;j<=m+1;j+=lowbit(j))tr[i][j]=std::max(tr[i][j],val);
}int Query(int x,int y){int ret=0;for(int i=x;i;i-=lowbit(i))for(int j=y;j;j-=lowbit(j))ret=std::max(tr[i][j],ret);return ret;
}int main(){read(n);read(m);for(int i=1;i<=n;i++)read(A[i]),Max_val=std::max(Max_val,A[i]);for(int i=1;i<=n;i++){for(int j=m;j>=0;j--){int tmp=Query(A[i]+j,j+1)+1;ans=std::max(ans,tmp);Add(A[i]+j,j+1,tmp);}}printf("%d\n",ans);return 0;
}
传送门
转载于:https://www.cnblogs.com/Exbilar/p/6851826.html
[bzoj 3594] [Scoi2014]方伯伯的玉米田相关推荐
- bzoj 3594: [Scoi2014]方伯伯的玉米田
3594: [Scoi2014]方伯伯的玉米田 Time Limit: 60 Sec Memory Limit: 128 MB Submit: 1399 Solved: 627 [Submit][ ...
- [SCOI2014]方伯伯的玉米田 //二维树状数组优化DP
题目: 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐.方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感的玉米拔除掉,使得剩 ...
- bzoj3594[Scoi2014]方伯伯的玉米田
http://www.lydsy.com/JudgeOnline/problem.php?id=3594 题目就是问你至多操作K次后的最长上升子序列. 首先,我们会得到一个结论:每次操作区间的右端点一 ...
- bzoj3594 [Scoi2014]方伯伯的玉米田
题目链接 二维树状数组优化DP DP状态很容易想到:dp[i][j]表示到第i颗玉米,用了j次提升,最多保留多少: 转移: dp[i][j]=dp[k][j]+1(k<=i&&a ...
- [SCOI2014]方伯伯的玉米田
题目链接 算法: 为了保证DP的正确与方便,这里先提供一个结论:每次操作都一定要拔高第n棵玉米. 以下引用NS·YJD大佬的一篇博客的证明: 首先无论操作区间在哪里,如果区间两边存在玉米,那么这些玉米 ...
- 2019.03.28 bzoj3594: [Scoi2014]方伯伯的玉米田(二维bit优化dp)
传送门 题意咕咕咕 思路:直接上二维bitbitbit优化dpdpdp即可. 代码: #include<bits/stdc++.h> #define N 10005 #define K 5 ...
- SCOI2014 方伯伯的玉米田 题解
可能其它还没写完的几篇随笔要搁一会儿,反正先写写题解 \(1-n\)的一个序列,值分别为\(a[1]\).\(a[2]...a[n]\),最多可进行\(K\)次操作,每次操作可以使\(l-r\)区间内 ...
- P3287 [SCOI2014]方伯伯的玉米田
原题链接 数据结构优化DP 前置知识:二维树状数组 e.g.https://www.luogu.com.cn/problem/P4514 思路如下: 代码如下: #include <cstdio ...
- Luogu 3287 LOJ 2211 BZOJ 3594 [SCOI 2014] 方伯伯的玉米田 详解
[SCOI 2014] 方伯伯的玉米田 题解详^详详 温馨链接 洛谷3287 LOJ2211 BZOJ3594(3倍的快乐) 题目重述 在一个序列 hhh 上你可以最多执行 KKK 次操作,每次操作可 ...
最新文章
- 无需数据线,在Windows电脑上就可以浏览和编辑华为的手机文件
- TCP传输的单个报文最大字节(MSS和MTU)
- java 重写方法 访问权限_为何Java中子类重写方法的访问权限不能低于父类中权限(内含里氏替换原则)...
- mysql简单语句_MySQL 简单的语句
- 爬虫项目之豆瓣电影排行榜前10页
- oracle 结果缓存,Result cache结果缓存
- 【转】mysql锁表解决方法
- 网格(UED所谓栅格化)方案生成器
- Visual studio 2013 连接MySQL数据库的设置。
- centos 7.2 安装 mysql_liunx centos7.2系统上如何安装和配置mysql数据库
- win7+nfs文件服务器,win7如何挂载nfs服务器
- x299服务器芯片,X299比X399差在哪? 两大平台产品比拼
- CAD小问题解决办法1
- MSI和MSI-X对比(五)
- python天气预报项目详细设计书_天气预报详细设计说明书
- 利用钩子技术控制进程创建
- Linux操作系统学习笔记3【图形界面与命令行】
- ros(Melodic)记录
- c编程十六进制数据输出格式_使用C编程语言处理十六进制值
- 环特生物研究团队最新论文表示,杀虫剂仲丁威或诱发神经毒性
热门文章
- 微信小程序入门第一天
- 权限管理(1):简介
- 红帽和Mirantis宣告结束OpenStack合作
- MySQL系列:数据库基本操作(1)
- 转:SQL Server 2005安装过程图解
- java blockqueue_[Java基础] Java多线程-工具篇-BlockingQueue
- linux wget 命令_我如何使用wget Linux命令恢复丢失的图像
- devops 开源工具链_使用开源工具构建DevOps管道的初学者指南
- 前端:HTML/04/html颜色表示,计算机进制,锚点链接,计算机编码(字符集)
- node 连接mongodb