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

题目就是问你至多操作K次后的最长上升子序列。

首先,我们会得到一个结论:每次操作区间的右端点一定是n。

记$F[i][j]$表示前$i$棵玉米,使用$j$次操作时,以第$i$棵玉米为结尾的最长上升子序列的长度,则:

$$F[i][j]=Max\{F[k][l]|k<i,l\leq j,a[k]+l \leq a[i]+j\}+1$$

状态$F[i][j]$等价于一个三元组$(i,a[i]+j,j)$

其实就是求三元组的三维偏序。

然后我脑抽用CDQ分治,结果TLE。。。。。。~OTATO~

发现其实用二维树状数组即可。

真是*了狗了。

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<utility>
#include<set>
#include<bitset>
#include<vector>
#include<functional>
#include<deque>
#include<cctype>
#include<climits>
#include<complex>
//#include<bits/stdc++.h>适用于CF,UOJ,但不适用于pojusing namespace std;typedef long long LL;
typedef double DB;
typedef pair<int,int> PII;
typedef complex<DB> CP;#define mmst(a,v) memset(a,v,sizeof(a))
#define mmcy(a,b) memcpy(a,b,sizeof(a))
#define fill(a,l,r,v) fill(a+l,a+r+1,v)
#define re(i,a,b)  for(i=(a);i<=(b);i++)
#define red(i,a,b) for(i=(a);i>=(b);i--)
#define ire(i,x) for(typedef(x.begin()) i=x.begin();i!=x.end();i++)
#define fi first
#define se second
#define m_p(a,b) make_pair(a,b)
#define p_b(a) push_back(a)
#define SF scanf
#define PF printf
#define two(k) (1<<(k))template<class T>inline T sqr(T x){return x*x;}
template<class T>inline void upmin(T &t,T tmp){if(t>tmp)t=tmp;}
template<class T>inline void upmax(T &t,T tmp){if(t<tmp)t=tmp;}inline int sgn(DB x){if(abs(x)<1e-9)return 0;return(x>0)?1:-1;}
const DB Pi=acos(-1.0);int gint(){int res=0;bool neg=0;char z;for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());if(z==EOF)return 0;if(z=='-'){neg=1;z=getchar();}for(;z!=EOF && isdigit(z);res=res*10+z-'0',z=getchar());return (neg)?-res:res; }
LL gll(){LL res=0;bool neg=0;char z;for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());if(z==EOF)return 0;if(z=='-'){neg=1;z=getchar();}for(;z!=EOF && isdigit(z);res=res*10+z-'0',z=getchar());return (neg)?-res:res; }const int maxn=10000;
const int maxK=500;
const int maxv=5000+maxK;int n,K;
int a[maxn+100],v;
int f[maxn+100][maxK+10],ans;#define lowbit(a) ((a)&(-a))
int tr[maxv+100][maxK+100];
void update(int x,int y,int val){int i,j;for(i=x;i<=v;i+=lowbit(i))for(j=y+1;j<=K+1;j+=lowbit(j))upmax(tr[i][j],val);}
int ask(int x,int y){int res=0,i,j;for(i=x;i>=1;i-=lowbit(i))for(j=y+1;j>=1;j-=lowbit(j))upmax(res,tr[i][j]);return res;}int main(){freopen("bzoj3594.in","r",stdin);freopen("bzoj3594.out","w",stdout);int i,j;n=gint();K=gint();re(i,1,n)a[i]=gint(),upmax(v,a[i]);v+=K;re(i,1,n){re(j,0,K)f[i][j]=ask(a[i]+j,j)+1;re(j,0,K)update(a[i]+j,j,f[i][j]);re(j,0,K)upmax(ans,f[i][j]);}cout<<ans<<endl;return 0;}

View Code

转载于:https://www.cnblogs.com/maijing/p/4857761.html

bzoj3594[Scoi2014]方伯伯的玉米田相关推荐

  1. bzoj3594 [Scoi2014]方伯伯的玉米田

    题目链接 二维树状数组优化DP DP状态很容易想到:dp[i][j]表示到第i颗玉米,用了j次提升,最多保留多少: 转移: dp[i][j]=dp[k][j]+1(k<=i&&a ...

  2. 2019.03.28 bzoj3594: [Scoi2014]方伯伯的玉米田(二维bit优化dp)

    传送门 题意咕咕咕 思路:直接上二维bitbitbit优化dpdpdp即可. 代码: #include<bits/stdc++.h> #define N 10005 #define K 5 ...

  3. bzoj 3594: [Scoi2014]方伯伯的玉米田

    3594: [Scoi2014]方伯伯的玉米田 Time Limit: 60 Sec  Memory Limit: 128 MB Submit: 1399  Solved: 627 [Submit][ ...

  4. [bzoj 3594] [Scoi2014]方伯伯的玉米田

    [bzoj 3594] [Scoi2014]方伯伯的玉米田 Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美. 这排玉米一共有N株,它们的高度参差不齐. 方伯伯认为 ...

  5. 【BZOJ3594】方伯伯的玉米田(SCOI2014)-DP+二维树状数组

    测试地址:方伯伯的玉米田 做法:本题需要用到DP+二维树状数组. 首先,我们发现每次拔高的区间都是一个后缀.这个自己画一画就大概能证出来了. 那么我们就有了一个状态定义:令 f(i,j) f ( i ...

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

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

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

    题目链接 算法: 为了保证DP的正确与方便,这里先提供一个结论:每次操作都一定要拔高第n棵玉米. 以下引用NS·YJD大佬的一篇博客的证明: 首先无论操作区间在哪里,如果区间两边存在玉米,那么这些玉米 ...

  8. SCOI2014 方伯伯的玉米田 题解

    可能其它还没写完的几篇随笔要搁一会儿,反正先写写题解 \(1-n\)的一个序列,值分别为\(a[1]\).\(a[2]...a[n]\),最多可进行\(K\)次操作,每次操作可以使\(l-r\)区间内 ...

  9. P3287 [SCOI2014]方伯伯的玉米田

    原题链接 数据结构优化DP 前置知识:二维树状数组 e.g.https://www.luogu.com.cn/problem/P4514 思路如下: 代码如下: #include <cstdio ...

最新文章

  1. 机器学习--多标签softmax + cross-entropy交叉熵损失函数详解及反向传播中的梯度求导
  2. 【Linux/Ubuntu学习3】解决ubuntu解压windows生成的zip文件时乱码问题
  3. 分析 linux 日志文件,linux精讲|操作系统常见日志文件分析
  4. java.util.Date与 java.sql.Date两个包下Date的区别与联系
  5. ocelot 自定义认证和授权
  6. 图像处理前沿技术_深入浅出人工智能前沿技术—机器视觉检测,看清人类智慧工业...
  7. 递归算法及其时间复杂度分析
  8. metal分析是什么意思_变压器原理是什么?容量是什么意思?电力工程技术专家精讲分析...
  9. 我的第一个java程序_我的第一个Java程序
  10. 趣谈 JOIN 操作
  11. 电大计算机网络模拟题及答案,最新国家开放大学电大本科《计算机网络》期末题库及答案...
  12. zw版_zw中文增强版Halcon官方Delphi例程
  13. AngularJs学习的前景及优势
  14. ionic3 打包错误解决:Could not resolve all files for configuration ':classpath'.
  15. C语言中scanf函数的用法
  16. fake_useragent导入无法引用的解决方法
  17. PICKIT3脱机烧写指导书
  18. 共享打印机服务器脱机状态,共享打印机脱机无法打印
  19. 动态更新 fqdn ptr linux,DNS简单概念 一
  20. Pixelmator Pro Mac(图像编辑软件)

热门文章

  1. Makefile中的“-I”(大写i),“-L”(大写l),“-l”(小写l)
  2. 【JTeam Champion NFT】2022年中NFT最大趋势是什么?
  3. jsp标签jsp:useBean用法
  4. 数字逻辑:险象和消除
  5. thinkjs基础学习
  6. 权重设计:客观赋权法的说明(熵权法/变异系数法/CRCIII法/TOPSIS法)
  7. spss统计软件分析学习笔记
  8. CP.26对称矩阵及正定性
  9. 【愚公系列】2022年09月 python人工智能-PyTorch环境配置及安装
  10. 算法-基于成交量的Adaboost股价涨跌预测模型