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]方伯伯的玉米田的更多相关文章

  1. bzoj 3594: [Scoi2014]方伯伯的玉米田 dp树状数组优化

    3594: [Scoi2014]方伯伯的玉米田 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 314  Solved: 132[Submit][Sta ...

  2. bzoj 3594 [Scoi2014]方伯伯的玉米田(DP+二维BIT)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3594 [题意] 给定一个n个数的序列,有K次将一个区间内的数加1的机会,问最长不下降子 ...

  3. BZOJ 3594 [Scoi2014]方伯伯的玉米田(二维树状数组)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3594 [题目大意] 给出一个数列,选出k个区间使得区间内数全部加1, 求k次操作之后最 ...

  4. bzoj 3594: [Scoi2014]方伯伯的玉米田【二维树状数组+dp】

    设f[i][j]为前i棵玉米被拔高了j(因为是单调不降所以前面越高越好,所以每次拔一个前缀),转移是f[i][j]=f[k][l]+1,l<=j,a[k]+l<=a[i]+j,然后用二维树 ...

  5. BZOJ 3594: [Scoi2014]方伯伯的玉米田 (二维树状数组优化DP)

    分析 首先每次增加的区间一定是[i,n][i,n][i,n]的形式.因为如果选择[i,j](j<n)[i,j](j<n)[i,j](j<n)肯定不如把后面的全部一起加111更优. 那 ...

  6. [SCOI2014]方伯伯的玉米田

    Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美. 这排玉米一共有N株,它们的高度参差不齐. 方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感 ...

  7. BZOJ3594: [Scoi2014]方伯伯的玉米田【二维树状数组优化DP】

    Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美. 这排玉米一共有N株,它们的高度参差不齐. 方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感 ...

  8. [SCOI2014]方伯伯的玉米田 题解(树状数组优化dp)

    Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美. 这排玉米一共有N株,它们的高度参差不齐. 方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感 ...

  9. bzoj3594: [Scoi2014]方伯伯的玉米田--树状数组优化DP

    题目大意:对于一个序列,可以k次选任意一个区间权值+1,求最长不下降子序列最长能为多少 其实我根本没想到可以用DP做 f[i][j]表示前i棵,操作j次,最长子序列长度 p[x][y]表示操作x次后, ...

随机推荐

  1. javaScript操作DOM对象(看三遍,敲三遍,写三遍! 不会你找我)!!

    DOM是Document Object Model的缩写,即文档对象模型,是基于文档编程的一套API 使用javaScript操作DOM对象通常分为三类:1.DOM CORE        2.HTM ...

  2. Swift数组的迭代访问

    你可以通过for-in循环来迭代访问整个数组的值. for item in shoppingList { println(item) } // Six eggs // Milk // Flour // ...

  3. mongodb取出最大值与最小值

    $res=self::aggregate([ ['$match'=>[ 'msg_id'=>1007, 'D'=>16, ]], ['$group'=>[ '_id'=> ...

  4. Server from URL

    在你做网页时,如果网页需要运行ActiveX或脚本,并且他们位于客户端以外的地方, 那么可以添加这个注释语句,IE当然不会不理他, IE会按照他指出的URL去找脚本的位置. 这句话的作用是让Inter ...

  5. H3C交换机删除VLAN与其绑定端口配置

    在系统视图下,执行 undo int vlan 2 undo vlan 2 可以删除vlan2的配置信息. 执行 undo vlan all 可以删除所有的vlan信息. 在vlan2视图下,执行: ...

  6. haproxy+tomcat集群搭建

    web1和web2的部署可参考我之前的文章<Tomcat集群搭建>,这里就省去该过程了. #安装haproxy- .tar.gz cd haproxy-/ make TARGET=linu ...

  7. 将notepad++打造成java快速开发IDE

    参考文章:http://blog.csdn.net/mdyyzc/article/details/7653096 有时候要试验一小段代码,打开eclipse又需要忍受漫长的煎熬(电脑配置较低,见谅). ...

  8. 英文版windows7中文软件显示乱码的解决办法

    一.打开控制面板,修改语言的归属地为China 修改完成之后重启,一般能解决大部分问题,如果依然有部分显示乱码,就需要去修改注册表

  9. 几个SQL语句(备忘)

    1.三涨停 select biao1.代码,biao1.名称 from biao1,biao2,biao3 where (biao1.涨幅+ biao2.涨幅+biao3.涨幅)>0.27 an ...

  10. Python Django之路与您同行

    大家好,我是TT,互联网测试行业多年,没有牛逼的背景,也没有什么可炫耀的,唯独比他人更努力,在职场打拼.遇到过的坑,走过的弯路,愿意与大家分享,分享自己的经验,少走弯路.首发于个人公众号[测试架构师] ...