BZOJ 3173: [Tjoi2013]最长上升子序列 (线段树+BIT)
2024-09-05 11:35:04
先用线段树预处理出每个数最终的位置.然后用BIT维护最长上升子序列就行了.
用线段树O(nlogn)O(nlogn)O(nlogn)预处理就直接倒着做,每次删去对应位置的数.具体看代码
CODE
#include<bits/stdc++.h>
using namespace std;
char cb[1<<15],*cs=cb,*ct=cb;
#define getc() (cs==ct&&(ct=(cs=cb)+fread(cb,1,1<<15,stdin),cs==ct)?0:*cs++)
template<class T>inline void read(T &res) {
char ch; int flg = 1; while(!isdigit(ch=getc()))if(ch=='-')flg=-flg;
for(res=ch-'0';isdigit(ch=getc());res=res*10+ch-'0'); res*=flg;
}
const int MAXN = 100005;
int n, m, x[MAXN], rk[MAXN], ans, sz[MAXN<<2], T[MAXN];
inline void chkmax(int &x, int y) { if(y > x) x = y; }
inline void upd(int x, int val) { for(; x <= n; x += x&-x) chkmax(T[x], val); }
inline int qsum(int x) { int re = 0; for(; x; x -= x&-x) chkmax(re, T[x]); return re; }
inline void upd(int i) { sz[i] = sz[i<<1] + sz[i<<1|1]; }
void build(int i, int l, int r) {
if(l == r) { sz[i] = 1; return; }
int mid = (l + r) >> 1;
build(i<<1, l, mid);
build(i<<1|1, mid+1, r);
upd(i);
}
int query(int i, int l, int r, int k) {
if(l == r) { sz[i] = 0; return l; }
int mid = (l + r) >> 1, re;
if(k <= sz[i<<1]) re = query(i<<1, l, mid, k);
else re = query(i<<1|1, mid+1, r, k-sz[i<<1]);
upd(i); return re;
}
int main() {
read(n); build(1, 1, n);
for(int i = 1; i <= n; ++i) read(x[i]), ++x[i];
for(int i = n; i >= 1; --i) rk[i] = query(1, 1, n, x[i]); //!
for(int i = 1, f; i <= n; ++i) {
chkmax(ans, f = qsum(rk[i]) + 1);
printf("%d\n", ans);
upd(rk[i], f);
}
}
最新文章
- 接触Matlab10年后的一个总结,随时使用Matlab要掌握的一些要点
- 2013长沙赛区现场赛 J - Josephina and RPG
- asp.net 发布后,遇到的导出excel报错的问题
- NSObject的load和initialize方法(转)
- OC3_Copy及MultableCopy
- JQ跑马灯
- OpenID说明
- Access获取新插入数据的自增长主键Id
- HTTP生命周期
- NYOJ 118 路方案(第二小的跨越)
- DFS PKU 1562
- [注意事项&;amp;车轮]java源代码 产生局部javadoc api档
- Swiper3 的特色功能
- linux dns搭建
- 学JAVA第八天,今天用循环做了个好玩的东西
- SmartGit/HG
- DP专题:划分数问题
- RabbitMQ三种Exchange模式(fanout,direct,topic)的性能比较(转)
- CRNA的使用
- TopCoder SRM624 BuildingHeightEasy 题解
热门文章
- 【转帖】比df命令更有用的磁盘信息工具
- 【转载】启动redis出现Creating Server TCP listening socket *:6379: bind: No such file or directory
- appium-Android_webview页面元素定位遇到的问题
- git回退
- 【spring Boot】spring boot获取资源文件的三种方式【两种情况下】
- pg_ctl — 启动、停止、重启 PostgreSQL
- 《深入实践C++模板编程》之二——模板类
- python 访问权限
- Java学习笔记【十一、序列化】
- Kernel boot options