[2019.3.17]BZOJ1109 [POI2007]堆积木Klo
考虑暴力dp。
设\(dp_i\)表示前\(i\)个积木,保留积木\(i\)的最大答案。
那么有
\(dp_i=max(dp_j)+1(i>j,a_i>a_j,a_i-a_j\le i-j)\)
对\(j\)的限制条件里前2条显然,后一条是因为要使积木\(i\)和\(j\)之间有足够的积木使它们的相对位置正确。
由第三条可得\(i-a_i\ge j-a_j\)
那么就是一个三维偏序?
其实不是。由\(a_i>a_j,i-a_i\ge j-a_j\)可得\(i>j\)。
所以其实是一个二维偏序。
我们一开始记录\(v_i=i-a_i\),然后按\(a_i\)排序每次在线段树上查找\(v\)比\(v_i\)小的,\(dp\)的最大值用来更新答案,将\(dp_i\)加入线段树即可。
当然用树状数组也可以做。
code:
#include<bits/stdc++.h>
#define ci const int&
#define Upd(x) (t[x].mx=max(t[x<<1].mx,t[x<<1|1].mx))
using namespace std;
const int lim=1e6;
struct node{int l,r,mx;
}t[4000010];
struct CMP{int v1,v2;
}c[100010];
int n,h,sz,dp,ans;
bool cmp(CMP x,CMP y){return x.v1==y.v1?x.v2>y.v2:x.v1<y.v1;
}
void Build(ci x,ci l,ci r){t[x].l=l,t[x].r=r;if(l==r)return;int mid=l+r>>1;Build(x<<1,l,mid),Build(x<<1|1,mid+1,r);
}
void Change(ci x,ci d,ci v){if(t[x].l==t[x].r)return(void)(t[x].mx=max(t[x].mx,v));int mid=t[x].l+t[x].r>>1;d<=mid?Change(x<<1,d,v):Change(x<<1|1,d,v),Upd(x);
}
int Query(int x,int l,int r){if(t[x].l==l&&t[x].r==r)return t[x].mx;int mid=t[x].l+t[x].r>>1;return r<=mid?Query(x<<1,l,r):(l>mid?Query(x<<1|1,l,r):max(Query(x<<1,l,mid),Query(x<<1|1,mid+1,r)));
}
int main(){scanf("%d",&n);Build(1,0,lim);for(int i=1;i<=n;++i)scanf("%d",&h),i>=h?c[++sz]=(CMP){h,i-h},0:0;sort(c+1,c+sz+1,cmp);for(int i=1;i<=sz;++i)dp=Query(1,0,c[i].v2)+1,ans=max(ans,dp),Change(1,c[i].v2,dp);printf("%d",ans);return 0;
}
转载于:https://www.cnblogs.com/xryjr233/p/BZOJ1109.html
[2019.3.17]BZOJ1109 [POI2007]堆积木Klo相关推荐
- BZOJ1109: [POI2007]堆积木Klo
一开始状态就定的不一样-一直想着优化转移然后越走越远.. %%%Seter 我们令f[i]表示第i个积木的积木回到自己的位置,前i个积木最多有多少个归位 枚举前一个归位的积木,可以得到 f[i]=f[ ...
- bzoj 1109: [POI2007]堆积木Klo(二维偏序)
1109: [POI2007]堆积木Klo Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1139 Solved: 423 [Submit][St ...
- BZOJ 1109 [POI2007]堆积木Klo(树状数组)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1109 [题目大意] Mary在她的生日礼物中有一些积木.那些积木都是相同大小的立方体. ...
- BZOJ 1109: [POI2007]堆积木Klo 神分析, LIS, BIT, 二分
Description Mary在她的生日礼物中有一些积木.那些积木都是相同大小的立方体.每个积木上面都有一个数.Mary用他的 所有积木垒了一个高塔.妈妈告诉Mary游戏的目的是建一个塔,使得最多的 ...
- BZOJ.1109.[POI2007]堆积木Klo(DP LIS)
BZOJ 二维\(DP\)显然.尝试换成一维,令\(f[i]\)表示,强制把\(i\)放到\(a_i\)位置去,现在能匹配的最多数目. 那么\(f[i]=\max\{f[j]\}+1\),其中\(j& ...
- [POI2007]堆积木Klo
题解: dp定义方程的时候 好像也不能都用前一个来递推..这样就不能优化了 这题看了题解才想出来... 还是很简单的啊.... 我们定义f[i]表示前i个最大收益 那么j要能从i转移就得满足a[i]- ...
- CVPR 2019 | 百度17篇论文入选,AI巨头都在关注什么?(附论文下载)
授权自AI科技大本营(ID:rgznai100) 本文共6400字,建议阅读10+分钟. 本文整理了百度入选CVPR的17篇论文的内容及应用场景. 计算机视觉和模式识别大会CVPR 2019即将于6月 ...
- 堆积木(基本数据结构-ArrayList数组的使用)
蒜头君有 n 块积木,编号分别为 1 到 n.一开始,蒜头把第 i 块积木放在位置 i.蒜头君进行 m次操作,每次操作,蒜头把位置 b 上的积木整体移动到位置 a 上面. 比如 1 位置的积木是 1, ...
- echarts树点击label事件_ECharts 堆积木(砖块)游戏
最近突发奇想,用 3D 的堆叠柱图,做了一个搭积木的小游戏. 主要思路 用一个几乎透明的 series-bar3D 铺满整个 grid3D,作为操作区,监听鼠标点击事件.完成堆积木的操作: 用多层数据 ...
最新文章
- [Objective-c 基础 - 2.1] 封装
- Product Long text - children usage
- wireshark使用教程 linux,Linux入门教程:ubuntu下安装wireshark(以及配置非root),这个强大的工具可以捕...
- oracle的in集合,oracle中in与not in集合中有空值问题
- php怎么创建对象变量,php实现变量动态创建类的对象用法
- 指针 | golang之指针的学习
- 【java】窗口中监听器的应用
- pdf转word好用的软件
- Typora 如何自动生成标题序号
- 如今引流横行的时代,你还缺乏流量吗?
- PHP字符串变量的长度限制问题
- 继承CAcUiStringEdit,改变编辑框的字体颜色,以及背景的颜色
- 工信部规范云服务市场经营行为 概念股望爆发
- 抖音电脑版怎么自动播放视频?
- VOD (Video On Demand),视频点播技术
- NRZ 对比 PAM4 调制技术
- 魔兽转移账号的服务器,《魔兽世界》那些区能进行免费角色转移服务 安苏、死亡之翼服务器免费角色转移服务现已开放...
- 假如生活欺骗了你-普希金
- asp.net 全局sql注入处理 sql关键字过滤 global过滤sql
- c语言中什么叫喂狗,STM32是怎么初始化看门狗和喂狗的