bzoj 3594: [Scoi2014]方伯伯的玉米田
3594: [Scoi2014]方伯伯的玉米田
Time Limit: 60 Sec Memory Limit: 128 MB
Submit: 1399 Solved: 627
[Submit][Status][Discuss]
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
从贪心的角度,显然有从i到n整体提高要比i到某个r提高优。因为当提高范围为r(r!=n)时,无非两种情况一种是在[r+1,n]存在一个庄稼原来比(I,r]中的某一个使得在r以前长度最大值的点大于或等于,另一种是没有更大的。那么对于第二种对于答案没有贡献,我们从i到n拔高也就没影响,而当出现第一种时,可能由于多次拔高使得原本可以在[r+1,n]之间可以有贡献的点失败了,那么显然没有从i到n拔高更优。
不优化的姿势呢显然。
F[i][j]表示第i个位置时(必须使用第i个位置)使用了j次技能的最大长度。所以F[i][j]=max(F[x][y])(x<i,y<j,a[x]<=a[i]+y-j)
===>(x<i,y<j,a[x]+y<=a[i]+j)。显然对于每次添加,都是现在已有状态都是满足x<i。现在我们可以将y与a[x]+y搞成树状数组,每次添加都是在左下角矩形中选一个最大值。然后这两维就可以优化为log2(n)*log2(m+max(a[i]));
总时间复杂度就是O(n*k* log2(n)*log2(m+max(a[i])))。恩,反正过了=-=。
#include<cstdio>
#include<iostream>
#define lowbit(x) (x&(-x))
using namespace std;
const int N=;
int n,m,mx;
int a[N];
int c[N][];
void add(int x,int y,int w){
for(int i=x;i<=mx;i+=lowbit(i))
for(int j=y;j<=m+;j+=lowbit(j))
c[i][j]=max(w,c[i][j]);
}
inline int sum(int x,int y){
int ans=;
for(int i=x;i;i-=lowbit(i))
for(int j=y;j;j-=lowbit(j))
ans=max(ans,c[i][j]);
return ans;
}
int f[N][];
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){scanf("%d",a+i);mx=a[i]>mx?a[i]:mx;}
mx+=m;
int ans=;
for(int i=;i<=n;i++){
for(int j=m;j>=;j--){
f[i][j]=sum(a[i]+j,j+)+;
// printf("f[%d][%d]=%d\n",i,j,f[i][j]);
add(a[i]+j,j+,f[i][j]);
ans=max(ans,f[i][j]);
}
}
printf("%d",ans);
}
/*
3 1
2 1 3
*/
bzoj 3594: [Scoi2014]方伯伯的玉米田的更多相关文章
- bzoj 3594: [Scoi2014]方伯伯的玉米田 dp树状数组优化
3594: [Scoi2014]方伯伯的玉米田 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 314 Solved: 132[Submit][Sta ...
- bzoj 3594 [Scoi2014]方伯伯的玉米田(DP+二维BIT)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3594 [题意] 给定一个n个数的序列,有K次将一个区间内的数加1的机会,问最长不下降子 ...
- BZOJ 3594 [Scoi2014]方伯伯的玉米田(二维树状数组)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3594 [题目大意] 给出一个数列,选出k个区间使得区间内数全部加1, 求k次操作之后最 ...
- bzoj 3594: [Scoi2014]方伯伯的玉米田【二维树状数组+dp】
设f[i][j]为前i棵玉米被拔高了j(因为是单调不降所以前面越高越好,所以每次拔一个前缀),转移是f[i][j]=f[k][l]+1,l<=j,a[k]+l<=a[i]+j,然后用二维树 ...
- BZOJ 3594: [Scoi2014]方伯伯的玉米田 (二维树状数组优化DP)
分析 首先每次增加的区间一定是[i,n][i,n][i,n]的形式.因为如果选择[i,j](j<n)[i,j](j<n)[i,j](j<n)肯定不如把后面的全部一起加111更优. 那 ...
- [SCOI2014]方伯伯的玉米田
Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美. 这排玉米一共有N株,它们的高度参差不齐. 方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感 ...
- BZOJ3594: [Scoi2014]方伯伯的玉米田【二维树状数组优化DP】
Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美. 这排玉米一共有N株,它们的高度参差不齐. 方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感 ...
- [SCOI2014]方伯伯的玉米田 题解(树状数组优化dp)
Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美. 这排玉米一共有N株,它们的高度参差不齐. 方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感 ...
- bzoj3594: [Scoi2014]方伯伯的玉米田--树状数组优化DP
题目大意:对于一个序列,可以k次选任意一个区间权值+1,求最长不下降子序列最长能为多少 其实我根本没想到可以用DP做 f[i][j]表示前i棵,操作j次,最长子序列长度 p[x][y]表示操作x次后, ...
随机推荐
- js___原生js轮播
原生js轮播 作为一名前端工程师,手写轮播图应该是最基本掌握的技能,以下是我自己原生js写的轮播,欢迎指点批评: 首先css代码 a{text-decoration:none;color:#3DBBF ...
- asp.net web api实现图片点击式图片验证码
现在验证码的形式越来越丰富,今天要实现的是在点击图片中的文字来进行校验的验证码,如图 这种验证码验证是验证鼠标是否选中了图片中文字的位置,以及选择的顺序,产生验证码的时候可以提供一组底图,然后随机获取 ...
- sql with as 用法(转载)
一.WITH AS的含义 WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到.有的时候, ...
- Linux文件管理浅析(一) _磁盘管理基础
本文主要讨论一些磁盘管理相关的基本概念,同时也是这一系列文章的第一篇,就是下图中的最下一层的一部分. 在Linux中,SATA/USB/SCSI接口都是使用SCSI模块实现的,所以使用这些接口的硬盘在 ...
- java的logcat的简单使用
android.util.Log常用的方法有以下5个:Log.v() Log.d() Log.i() Log.w() 以及 Log.e() .根据首字母对应VERBOSE,DEBUG,INFO, WA ...
- SequoiaDB版本在线升级介绍说明
1.前言 在SequoiaDB数据库发展过程中,基本保持每半年对外发行一个正式的Release版本.并且每个新发布的Release版本相对老版本而言,性能方面都有很大的提高,并且数据库也会在新版本中加 ...
- SharePoint 2016 修改左上角连接
SharePoint 2016默认会有左上角这样的一个功能. 估计都想把它改掉. 方法1: 打开,输入下面的命令,可将图中的sharepoint修改为想要的文字 $webapp = Get-SPWe ...
- Windows10 Enterprise版本周年更新问题
安装Windows10的时候,蛋疼选择了企业版本,导致后来周年更新遇到了蛋疼的问题. 首先是无法接收到周年更新的推送.记得首个周年更新的时候,等了大半年都没有.后来使用了易升进行更新,可以检测到,但是 ...
- android权限(permission)大全
权限添加位置: 权限代码: 1.android.permission.WRITE_USER_DICTIONARY允许应用程序向用户词典中写入新词 2.android.permission.WRITE_ ...
- php 时间戳转化成天数 四舍五入 整数
public function edit() { global $_W; global $_GPC; $openid=$_W['openid']; $boards = pdo_fetchall('se ...