BZOJ1109 : [POI2007]堆积木Klo
2015-07-01 23:53
190 查看
f[i]表示第i个在自己位置上的最大值
则f[i]=max(f[j])+1
其中
j<i
a[j]<a[i]
a[i]-a[j]<=i-j -> j-a[j]<=i-a[i]
i-a[i]>=0
j-a[j]>=0
发现后两项可以推出第一项,所以是一个LIS问题,排序后树状数组优化DP即可,时间复杂度$O(n\log n)$。
则f[i]=max(f[j])+1
其中
j<i
a[j]<a[i]
a[i]-a[j]<=i-j -> j-a[j]<=i-a[i]
i-a[i]>=0
j-a[j]>=0
发现后两项可以推出第一项,所以是一个LIS问题,排序后树状数组优化DP即可,时间复杂度$O(n\log n)$。
#include<cstdio> #include<algorithm> #define N 100010 int n,i,j,k,a ,b ,bit ,t,f ,ans; struct E{int x,y;E(){}E(int _x,int _y){x=_x,y=_y;}}e ; inline bool cmp(E a,E b){return a.x<b.x;} inline int lower(int x){ int l=1,r=n,mid,t; while(l<=r)if(b[mid=(l+r)>>1]<=x)l=(t=mid)+1;else r=mid-1; return t; } inline void ins(int x,int y){for(;x<=n;x+=x&-x)if(bit[x]<y)bit[x]=y;} inline void ask(int x){for(;x;x-=x&-x)if(t<bit[x])t=bit[x];} inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';} int main(){ for(read(n),i=1;i<=n;i++)read(j),e[i]=E(j,i-j),b[i]=i-j; std::sort(e+1,e+n+1,cmp),std::sort(b+1,b+n+1); for(i=1;i<=n;i=j){ for(j=i;j<=n&&e[j].x==e[i].x;j++)if(e[j].y>=0){ t=0,ask(e[j].y=lower(e[j].y)); if(ans<(f[j]=++t))ans=t; } for(j=i;j<=n&&e[j].x==e[i].x;j++)if(e[j].y>=0)ins(e[j].y,f[j]); } return printf("%d",ans),0; }
相关文章推荐
- 1023. 分钟秒钟的时间相减
- Ubuntu14.04 编译安装 MySQL-5.6.22
- GCC compile debug: print include files and compile stage info.
- Tair分布式缓存
- 单片机学习笔记1
- Monkey 笔记
- 1022. 车辆选择(继承)
- 10个工具让你的 shell 脚本更强大
- 文件操作
- Oracle 细节
- mysql 无法联接常见故障及原因
- 10个工具让你的 shell 脚本更强大
- 树状数组三种写法
- sql where 1=1和 0=1 的作用
- Tedis:淘宝的Redis的Java客户端开发包
- 1021. 多重继承
- CentOS6.6 安装与配置 MySQL Cluster 7.4.4
- 算法——成语首尾接龙 成语接龙
- 没错,我就是个妹子
- iOS之内存管理