[SCOI 2014] 方伯伯的玉米田

[题目链接]

https://www.lydsy.com/JudgeOnline/problem.php?id=3594

[算法]

首先有一个结论 : 每次选择的区间右端点一定是n

根据这个结论 , 设fi,j表示前i株玉米拔高j次的最长不下降子序列长度

则fi,j = max{fp,q + 1} (q <= j , ap + q <= ai + j)

二维树状数组优化即可

时间复杂度 : O(NKlogK ^ 2)

[代码]

#include<bits/stdc++.h>
using namespace std;
#define N 10010
#define K 510
#define M 5510
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;

#define rint register int

int n , k , m;
int a[N];
int c[K][M];

template <typename T> inline void chkmin(T &x , T y) { x = min(x , y); }
template <typename T> inline void chkmax(T &x , T y) { x = max(x , y); }
template <typename T> inline void read(T &x)
{
   T f = 1; x = 0;
   char c = getchar();
   for (; !isdigit(c); c = getchar()) if (c == ‘-‘) f = -f;
   for (; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + c - ‘0‘;
   x *= f;
}

inline int lowbit(int x)
{
    return x & (-x);
}
inline void modify(int x , int y , int value)
{
    for (rint i = x; i <= k + 1; i += lowbit(i))
    {
        for (rint j = y; j <= m; j += lowbit(j))
        {
            chkmax(c[i][j] , value);
        }
    }
}
inline int query(int x , int y)
{
    int ret = 0;
    for (rint i = x; i; i -= lowbit(i))
    {
        for (rint j = y; j; j -= lowbit(j))
        {
            chkmax(ret , c[i][j]);
        }
    }
    return ret;
}

int main()
{

   // f(i , j) = max{ f(p , q) + 1 } ( q <= j , ap + q <= ai + j }
   read(n); read(k);
   int mx = 0;
   for (rint i = 1; i <= n; i++)
   {
           read(a[i]);
           chkmax(mx , a[i]);
   }
   m = k + mx + 1;
   int ans = 0;
   for (rint i = 1; i <= n; i++)
   {
           for (rint j = k; ~j; j--)
           {
               int tmp = query(j + 1 , a[i] + j) + 1;
               chkmax(ans , tmp);
            modify(j + 1 , a[i] + j , tmp);
        }
   }
   printf("%d\n" , ans);

   return 0;
}

原文地址:https://www.cnblogs.com/evenbao/p/10360374.html

时间: 2024-10-30 01:31:48

[SCOI 2014] 方伯伯的玉米田的相关文章

bzoj3594 [Scoi2014]方伯伯的玉米田

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

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

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

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

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

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

题面: 3594: [Scoi2014]方伯伯的玉米田 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 1403  Solved: 630[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株,它们的高度参差不齐.方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感的玉米拔除掉,使得剩下的玉米的高度构成一个单调不下降序列.方伯伯可以选择一个区间,

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

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

[SCOI2014]方伯伯的玉米田 //二维树状数组优化DP//unfinished

闲的慌,从HZOJ里挑了道DP题来做,没想到这么恐怖 但是已经开了坑也不能退,干脆写吧 题目: 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐.方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感的玉米拔除掉,使得剩下的玉米的高度构成一个单调不下降序列.方伯伯可以选择一个区间,把这个区间的玉米全部拔高1单位高度,他可以进行最多K次这样的操作.拔玉米则可以随意选择一个集合的玉米拔掉.问能最多剩多少株玉米,来构成一排美丽的玉米

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

【BZOJ3594】【SCOI2014】 方伯伯的玉米田

显然可以看出这是一道DP,然后就开始定义状态... f[i][j]表示已经处理完i根玉米,拔高了j次,剩下的玉米的最大值. f[i][j] = max{f[x][y]+1}(x<i,y<=j,h[x]+y<=h[i]+j). 于是就可以用二维树状数组维护最大值了,第一维维护拔高次数,第二维维护拔高后的高度. 1 #include <iostream> 2 #include <cstdlib> 3 #include <cstdio> 4 #include