BZOJ 3594 Scoi2014 方伯伯的玉米田 树状数组

题目大意:给定一个序列,可以选择k次区间并将区间内每个数都+1,求操作之后LIS的最大值

我的做法不是标解。。。5E的复杂度为何跑的飞起。。。

首先一个显而易见的结论就是我们选择的k次区间右端点都是n时才能保证最优

知道这个我们就可以DP了- -

令f[i][j]表示前i个数上升j次的最大LIS

那么有f[i][j]=max{f[k][l]|k<i,l<=j,a[k]+l<=a[i]+j}+1

看到三维偏序就可以用二维树状数组了- -

时间复杂度O(nklog(max(ai)+k)logk)

这复杂度跑的飞起真是醉了。。。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 10100
using namespace std;
int n,k,max_num,ans,a[M];
namespace BIT{
	int c[6060][550];
	void Update(int x,int y,int val)
	{
		int i,j;
		for(i=x;i<=max_num+k;i+=i&-i)
			for(j=y;j<=k+1;j+=j&-j)
				c[i][j]=max(c[i][j],val);
	}
	int Get_Ans(int x,int y)
	{
		int i,j,re=0;
		for(i=x;i;i-=i&-i)
			for(j=y;j;j-=j&-j)
				re=max(re,c[i][j]);
		return re;
	}
}
int main()
{
	using namespace BIT;
	int i,j;
	for(cin>>n>>k,i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		max_num=max(max_num,a[i]);
	}
	for(i=1;i<=n;i++)
		for(j=k;~j;j--)
		{
			int temp=Get_Ans(a[i]+j,j+1)+1;
			ans=max(ans,temp);
			Update(a[i]+j,j+1,temp);
		}
	cout<<ans<<endl;
	return 0;
}
时间: 2024-10-29 04:56:23

BZOJ 3594 Scoi2014 方伯伯的玉米田 树状数组的相关文章

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

题目大意:对于一个序列,可以k次选任意一个区间权值+1,求最长不下降子序列最长能为多少 其实我根本没想到可以用DP做 f[i][j]表示前i棵,操作j次,最长子序列长度 p[x][y]表示操作x次后,最高玉米为y时的最长子序列长度 那么以n棵玉米分阶段,对于每个阶段 f[i][j]=max{p[k][l]}+1,  其中k=1 to j , l=1 to a[i]+j 然后用树状数组维护p[][]的最大值 1 #include<stdio.h> 2 #include<string.h&g

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

3594: [Scoi2014]方伯伯的玉米田 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 314  Solved: 132[Submit][Status] Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐.方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感的玉米拔除掉,使得剩下的玉米的高度构成一个单调不下降序列.方伯伯可以选择一个区间,把这个区间的

BZOJ 3594[Scoi2014]方伯伯的玉米田

题面: 3594: [Scoi2014]方伯伯的玉米田 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 1403  Solved: 630[Submit][Status][Discuss] Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐.方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感的玉米拔除掉,使得剩下的玉米的高度构成一个单调不下降序列.方伯伯可

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

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3594 [题目大意] 给出一个数列,选出k个区间使得区间内数全部加1, 求k次操作之后最长的不下降子序列 [题解] 我们发现,每次的区间右端点一定贪心选到最右端才是最优的, 那么在用树状数组统计的时候,只要一个点被+1了,那么后面的点起码+1, 我们在树状数组后面加一维统计被区间包含的次数,发现也是前缀和关系, 所以用二维树状数组统计答案即可. 为避免自身被重复统计,第二维循环降序.

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

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3594 [题意] 给定一个n个数的序列,有K次将一个区间内的数加1的机会,问最长不下降子序列. [思路] 首先知道每次加1一个区间为[i,n]肯定不会差. 设f[i][j]为前i个数,还有j次机会的LIS,则有转移式: f[i][j] = max{ f[a][b],h[a]+b<=h[i]+j } 则可以用二维BIT加速方程转移. [代码] 1 #include<set> 2

3594: [Scoi2014]方伯伯的玉米田

3594: [Scoi2014]方伯伯的玉米田 Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐.方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感的玉米拔除掉,使得剩下的玉米的高度构成一个单调不下降序列.方伯伯可以选择一个区间,把这个区间的玉米全部拔高1单位高度,他可以进行最多K次这样的操作.拔玉米则可以随意选择一个集合的玉米拔掉.问能最多剩多少株玉米,来构成一排美丽的玉米. Input 第1行包含

【BZOJ 3594】 [Scoi2014]方伯伯的玉米田

3594: [Scoi2014]方伯伯的玉米田 Time Limit: 60 Sec Memory Limit: 128 MB Submit: 633 Solved: 256 [Submit][Status][Discuss] Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美. 这排玉米一共有N株,它们的高度参差不齐. 方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感的玉米拔除掉,使得剩下的玉米的高度构成一个单调不下降序列. 方伯伯可以选

bzoj3594 [Scoi2014]方伯伯的玉米田

3594: [Scoi2014]方伯伯的玉米田Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 1437 Solved: 647[Submit][Status][Discuss]Description方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐.方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感的玉米拔除掉,使得剩下的玉米的高度构成一个单调不下降序列.方伯伯可以选择一个区间,把

[Scoi2014]方伯伯的玉米田

[Scoi2014]方伯伯的玉米田 Time Limit: 60 Sec  Memory Limit: 128 MBhttp://www.lydsy.com/JudgeOnline/problem.php?id=3594 Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐.方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感的玉米拔除掉,使得剩下的玉米的高度构成一个单调不下降序列.方伯伯可以选择一个区间,