BZOJ3173 TJOI2013最长上升子序列(Treap+ZKW线段树)
Description
给定一个序列,初始为空。现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置。每插入一个数字,我们都想知道此时最长上升子序列长度是多少?
Input
第一行一个整数N,表示我们要将1到N插入序列中,接下是N个数字,第k个数字Xk,表示我们将k插入到位置Xk(0<=Xk<=k-1,1<=k<=N)
Output
N行,第i行表示i插入Xi位置后序列的最长上升子序列的长度是多少。
Sample Input
3
0 0 2
Sample Output
1
1
2
HINT
100%的数据 n<=100000
因为每一次加进来的都是最大的值,所以是不会更新其他的答案的,所以我们可以先把序列搞出来,离线乱搞搞就好了,没事就试了一下zkw线段树,发现还挺快的,不过还是要比树状数组慢不少。
/**************************************************************
Problem: 3173
User: geng4512
Language: C++
Result: Accepted
Time:644 ms
Memory:4712 kb
****************************************************************/
#include<cstdio>
#define MAXN 100005
struct node { int c[2], sz, rnd; } t[MAXN];
unsigned sd = 2333;
int Sz, a[MAXN], cnt, n, rt, mx[MAXN<<2], M, ans[MAXN];
inline int Max(int a, int b) { return a > b ? a : b; }
inline void GET(int &n) {
n = 0; char c;
do c = getchar(); while('0' > c || c > '9');
do n = n * 10 + c - '0', c = getchar(); while('0' <= c && c <= '9');
}
inline unsigned Ran() { return sd = sd * sd + 12580; }
inline void Upd(int k) { t[k].sz = t[t[k].c[0]].sz + t[t[k].c[1]].sz + 1; }
inline void Rot(int &k, bool f) {
int tmp = t[k].c[f]; t[k].c[f] = t[tmp].c[!f]; t[tmp].c[!f] = k;
Upd(k); Upd(tmp); k = tmp;
}
void Insert(int &k, int sz) {
if(!k) { k = ++ Sz; t[k].sz = 1; t[k].rnd = Ran(); return; }
++ t[k].sz;
bool f = t[t[k].c[0]].sz < sz;
Insert(t[k].c[f], sz - (t[t[k].c[0]].sz+1)*f);
if(t[k].rnd > t[t[k].c[f]].rnd) Rot(k, f);
}
void dfs(int u) {
if(!u) return;
dfs(t[u].c[0]);
a[++ cnt] = u;
dfs(t[u].c[1]);
}
namespace Seg {
void Insert(int x, int v) {
for(mx[x += M] = v, x >>= 1; x; x >>= 1)
mx[x] = Max(mx[x<<1], mx[x<<1|1]);
}
int Query(int r) {
int ans = 0;
for(r += M + 1; r ^ 1; r >>= 1)
if(r & 1) ans = Max(ans, mx[r^1]);
return ans;
}
}
int main() {
GET(n); int t;
for(int i = 1; i <= n; ++ i) {
GET(t);
Insert(rt, t);
}
dfs(rt);
for(M = 1; M < n + 2; M <<= 1);
for(int i = 1, tmp; i <= n; ++ i) {
tmp = Seg::Query(a[i]) + 1;
Seg::Insert(a[i], tmp);
ans[a[i]] = tmp;
}
for(int i = 1; i <= n; ++ i) {
ans[i] = Max(ans[i], ans[i-1]);
printf("%d\n", ans[i]);
}
return 0;
}
BZOJ3173 TJOI2013最长上升子序列(Treap+ZKW线段树)的更多相关文章
- bzoj 3173: [Tjoi2013]最长上升子序列【dp+线段树】
我也不知道为什么把题看成以插入点为结尾的最长生生子序列--还WA了好几次 先把这个序列最后的样子求出来,具体就是倒着做,用线段树维护点数,最开始所有点都是1,然后线段树上二分找到当前数的位置,把这个点 ...
- [BZOJ3173][Tjoi2013]最长上升子序列
[BZOJ3173][Tjoi2013]最长上升子序列 试题描述 给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数字,我们都想知道此时最长上 ...
- bzoj3173[Tjoi2013]最长上升子序列 平衡树+lis
3173: [Tjoi2013]最长上升子序列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2253 Solved: 1136[Submit][S ...
- bzoj3173: [Tjoi2013]最长上升子序列(树状数组+二分倒推)
3173: [Tjoi2013]最长上升子序列 题目:传送门 题解: 好题! 怎么说吧...是应该扇死自己...看错了两次题: 每次加一个数的时候,如果当前位置有数了,是要加到那个数的前面,而不是直 ...
- 【bzoj3173】[Tjoi2013]最长上升子序列 Treap
题目描述 给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数字,我们都想知道此时最长上升子序列长度是多少? 输入 第一行一个整数N,表示我们要 ...
- bzoj3173: [Tjoi2013]最长上升子序列(fhqtreap)
这题用fhqtreap可以在线. fhqtreap上维护以i结尾的最长上升子序列,数字按从小到大加入, 因为前面的数与新加入的数无关, 后面的数比新加入的数小, 所以新加入的数对原序列其他数的值没有影 ...
- bzoj千题计划316:bzoj3173: [Tjoi2013]最长上升子序列(二分+树状数组)
https://www.lydsy.com/JudgeOnline/problem.php?id=3173 插入的数是以递增的顺序插入的 这说明如果倒过来考虑,那么从最后一个插入的开始删除,不会对以某 ...
- BZOJ3173:[TJOI2013]最长上升子序列(Splay)
Description 给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数字,我们都想知道此时最长上升子序列长度是多少? Input 第一行一 ...
- 51nod 1376 最长递增子序列的数量(线段树)
51nod 1376 最长递增子序列的数量 数组A包含N个整数(可能包含相同的值).设S为A的子序列且S中的元素是递增的,则S为A的递增子序列.如果S的长度是所有递增子序列中最长的,则称S为A的最长递 ...
随机推荐
- android Drawable的问题
1.资源解析成Drawable getDrawable(int id); 挺简单一方法,可是 require api 21......如何向下兼容呢???? 幸亏有ContextCompat类...( ...
- safari渲染Transition动画不流畅问题
用css3的transition过渡来做页面动画的时候,发现在chrome和ff流畅,在safari 不流畅: 度娘找到了淘宝UED的一个类似解决方案,动画就流畅了. 测试环境: win7 32bit ...
- Android 环境常见问题
1.启动adb时报: adb server is out of data.kill... ADB server didn't ACK *failed to start daemon* er ...
- ubuntu14.04安装pycurl报错: __main__.ConfigurationError: Could not run curl-config: [Errno 2] No such file or directory
Collecting pycurl== (from -r requirement.txt (line )) Downloading http://pypi.doubanio.com/packages/ ...
- PLSQL在64位系统连接不上32位的服务器
1 主要是因为PLSQL只能接纳32位的客户端 2 下载oracle32位客户端 http://www.oracle.com/technetwork/topics/winsoft-085727.htm ...
- 查看某个线程占得CPU高
jps得到pid pidstat -p [pid] -t 1 5 -t表示显示该进程里面所有的线程的信息 06:20:32 PM TGID TID %usr ...
- Apache Spark-1.0.1集群搭建
欢迎经验交流!本文Blog地址:http://www.cnblogs.com/fesh/p/3866791.html Apache Spark a fast and general engine ...
- 灭顶之灾之网络电视精灵——S2 2.8
从前,有一个神奇的东西叫做搞搞精灵 关于他,有一段历史. 哎呀!我去!写不下去了. -.-以上玩笑 首先需求分析 TreeView显示两种频道 TypeA和TypeB 所以创建三个类 ChannelB ...
- POSIX信号处理
信号用于通知进程发生了某件事情,可以由一个进程发给另一个进程,也可以由内核发个一个进程. 每个信号都有一个关联的行为,可以通过sigaction函数来设置一个信号的行为,有3种选择: 1.定义一个信号 ...
- (转)对Oracle导出文件错误和DMP文件结构的分析,EXP-00008: 遇到 ORACLE 错误 904 ORA-00904: "MAXSIZE": invalid identifier
EXP-00008: 遇到 ORACLE 错误 904 ORA-00904: "MAXSIZE": invalid identifier 原因:oracle版本不一样 执行 C:/ ...