bzoj3594[Scoi2014]方伯伯的玉米田
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]方伯伯的玉米田相关推荐
- bzoj3594 [Scoi2014]方伯伯的玉米田
题目链接 二维树状数组优化DP DP状态很容易想到:dp[i][j]表示到第i颗玉米,用了j次提升,最多保留多少: 转移: dp[i][j]=dp[k][j]+1(k<=i&&a ...
- 2019.03.28 bzoj3594: [Scoi2014]方伯伯的玉米田(二维bit优化dp)
传送门 题意咕咕咕 思路:直接上二维bitbitbit优化dpdpdp即可. 代码: #include<bits/stdc++.h> #define N 10005 #define K 5 ...
- bzoj 3594: [Scoi2014]方伯伯的玉米田
3594: [Scoi2014]方伯伯的玉米田 Time Limit: 60 Sec Memory Limit: 128 MB Submit: 1399 Solved: 627 [Submit][ ...
- [bzoj 3594] [Scoi2014]方伯伯的玉米田
[bzoj 3594] [Scoi2014]方伯伯的玉米田 Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美. 这排玉米一共有N株,它们的高度参差不齐. 方伯伯认为 ...
- 【BZOJ3594】方伯伯的玉米田(SCOI2014)-DP+二维树状数组
测试地址:方伯伯的玉米田 做法:本题需要用到DP+二维树状数组. 首先,我们发现每次拔高的区间都是一个后缀.这个自己画一画就大概能证出来了. 那么我们就有了一个状态定义:令 f(i,j) f ( i ...
- [SCOI2014]方伯伯的玉米田 //二维树状数组优化DP
题目: 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐.方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感的玉米拔除掉,使得剩 ...
- [SCOI2014]方伯伯的玉米田
题目链接 算法: 为了保证DP的正确与方便,这里先提供一个结论:每次操作都一定要拔高第n棵玉米. 以下引用NS·YJD大佬的一篇博客的证明: 首先无论操作区间在哪里,如果区间两边存在玉米,那么这些玉米 ...
- SCOI2014 方伯伯的玉米田 题解
可能其它还没写完的几篇随笔要搁一会儿,反正先写写题解 \(1-n\)的一个序列,值分别为\(a[1]\).\(a[2]...a[n]\),最多可进行\(K\)次操作,每次操作可以使\(l-r\)区间内 ...
- P3287 [SCOI2014]方伯伯的玉米田
原题链接 数据结构优化DP 前置知识:二维树状数组 e.g.https://www.luogu.com.cn/problem/P4514 思路如下: 代码如下: #include <cstdio ...
最新文章
- 机器学习--多标签softmax + cross-entropy交叉熵损失函数详解及反向传播中的梯度求导
- 【Linux/Ubuntu学习3】解决ubuntu解压windows生成的zip文件时乱码问题
- 分析 linux 日志文件,linux精讲|操作系统常见日志文件分析
- java.util.Date与 java.sql.Date两个包下Date的区别与联系
- ocelot 自定义认证和授权
- 图像处理前沿技术_深入浅出人工智能前沿技术—机器视觉检测,看清人类智慧工业...
- 递归算法及其时间复杂度分析
- metal分析是什么意思_变压器原理是什么?容量是什么意思?电力工程技术专家精讲分析...
- 我的第一个java程序_我的第一个Java程序
- 趣谈 JOIN 操作
- 电大计算机网络模拟题及答案,最新国家开放大学电大本科《计算机网络》期末题库及答案...
- zw版_zw中文增强版Halcon官方Delphi例程
- AngularJs学习的前景及优势
- ionic3 打包错误解决:Could not resolve all files for configuration ':classpath'.
- C语言中scanf函数的用法
- fake_useragent导入无法引用的解决方法
- PICKIT3脱机烧写指导书
- 共享打印机服务器脱机状态,共享打印机脱机无法打印
- 动态更新 fqdn ptr linux,DNS简单概念 一
- Pixelmator Pro Mac(图像编辑软件)
热门文章
- Makefile中的“-I”(大写i),“-L”(大写l),“-l”(小写l)
- 【JTeam Champion NFT】2022年中NFT最大趋势是什么?
- jsp标签jsp:useBean用法
- 数字逻辑:险象和消除
- thinkjs基础学习
- 权重设计:客观赋权法的说明(熵权法/变异系数法/CRCIII法/TOPSIS法)
- spss统计软件分析学习笔记
- CP.26对称矩阵及正定性
- 【愚公系列】2022年09月 python人工智能-PyTorch环境配置及安装
- 算法-基于成交量的Adaboost股价涨跌预测模型