3173: [Tjoi2013]最长上升子序列

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 2051  Solved: 1041
[Submit][Status][Discuss]

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

nlogn单调递增:http://blog.csdn.net/jaihk662/article/details/52064213

偷偷建议这题不要看题解!

……

这题的条件其实大大降低了题目难度,首先最后的序列一定是1-n的全排列

其次每次都是加上当前最大的数,这个性质很重要

这就意味着你只要得出最终的序列,然后套一下nlogn的单调递增就可以求出所有答案

令best[x]表示以数字x结尾的最长序列,ans[x]就是第x个答案

那么ans[x]=max(best[i]  (1<=i<=x) )

主要是如何求出最终的序列

倒过来处理,很明显最后一个数所添加的位置一定是最终的位置,然后看下面的例子

假设样例为:

5

0 0 2 1 1

初始序列:

0 0 0 0 0(这一行就是最终序列,为0表示上面没有数字)

0 1 2 3 4(这一行表示前面有多少空位)

5加入第一个数字后面:

0 5 0 0 0

0 0 1 2 3

4加入第一个数字后面:

0 5 4 0 0

0 0 0 1 2

3加入第二个数字后面:

0 5 4 0 3

0 0 0 1 1

2加入最前面:

2 5 4 0 3

x x x 0 0(x的位置已经不可能再放数字了,可以理解为-1)

最后:

2 5 4 1 3(ok)

很显然的:树状数组维护前缀和,然后每次二分求第k个前缀最小

搞定

#include<stdio.h>
#include<algorithm>
using namespace std;
int n, len, cha[100005], tre[100005], a[100005], best[100005], ans[100005];
void Update(int x, int val)
{while(x<=n){tre[x] += val;x += x&-x;}
}
int Query(int x)
{int sum = 0;while(x){sum += tre[x];x -= x&-x;}return sum;
}
int Bsech(int x)
{int l, r, m;l = 0, r = len;while(l<r){m = l+(r-l)/2;if(best[m]>=x) r = m;elsel = m+1;}return l;
}
int main(void)
{int i, l, r, m, pos, now;scanf("%d", &n);for(i=1;i<=n;i++){scanf("%d", &cha[i]);Update(i, 1);}for(i=n;i>=1;i--){l = 1, r = n;cha[i] += 1;while(l<r){m = (l+r)/2;if(Query(m)<cha[i])l = m+1;elser = m;}a[r] = i;Update(r, -1);}len = 1;best[1] = a[1], ans[a[1]] = 1;for(i=2;i<=n;i++){if(a[i]>best[len])best[++len] = a[i], ans[a[i]] = len;else{ pos = Bsech(a[i]);ans[a[i]] = pos;best[pos] = a[i];}}now = 0;for(i=1;i<=n;i++){now = max(now, ans[i]);printf("%d\n", now);}return 0;
}

bzoj 3173: [Tjoi2013]最长上升子序列(离线二分+树状数组)相关推荐

  1. BZOJ 3173: [Tjoi2013]最长上升子序列

    3173: [Tjoi2013]最长上升子序列 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1524  Solved: 797 [Submit][ ...

  2. [BZOJ]3173: [Tjoi2013]最长上升子序列

    题解:   考虑按照元素升序加入  所以对位置在其后的元素LIS无影响 然后从前面位置的最大值转移过来就行 ,,,,平衡树无脑模拟 #include <algorithm> #includ ...

  3. 【BZOJ】3173: [Tjoi2013]最长上升子序列(树状数组)

    [题意]给定ai,将1~n从小到大插入到第ai个数字之后,求每次插入后的LIS长度. [算法]树状数组||平衡树 [题解] 这是树状数组的一个用法:O(n log n)寻找前缀和为k的最小位置.(当数 ...

  4. BZOJ 2434 NOI2011阿狸的打字机 AC自动机+树状数组

    如果你还没学AC自动机,请看这篇博客 Problem bzoj通道 洛谷通道 Solution 简单的说来,其实就是要快速求一个字符串在另一个字符串中出现了多少次.考虑构造AC自动机. 首先可以想到很 ...

  5. [BZOJ 3211]花神游历各国(并查集+树状数组)

    Description Solution 树状数组单点修改区间查询 我们知道一个数n最多修改loglogn次就会变为1 并查集维护每个数右边第一个不为1的位置 #include<cstdio&g ...

  6. BZOJ 2716 [Violet 3]天使玩偶 (CDQ分治、树状数组)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2716 怎么KD树跑得都那么快啊..我写的CDQ分治被暴虐 做四遍CDQ分治,每次求一个 ...

  7. bzoj 1106: [POI2007]立方体大作战tet(贪心+树状数组)

    1106: [POI2007]立方体大作战tet Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 785  Solved: 574 [Submit][ ...

  8. BZOJ3173 [TJOI2013]最长上升子序列

    题面: 3173: [Tjoi2013]最长上升子序列 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 2108  Solved: 1067 [Sub ...

  9. 【HDU - 5869】Different GCD Subarray Query(思维,数学,gcd,离线处理,查询区间不同数,树状数组 或 二分RMQ)

    题干: This is a simple problem. The teacher gives Bob a list of problems about GCD (Greatest Common Di ...

最新文章

  1. C#游戏开发快速入门教程Unity5.5教程
  2. fzu1062 洗牌问题(思路模拟)
  3. KMP算法的nextval[] 即优化next[]
  4. C++PrimerPlus学习——第十一章编程练习
  5. jsp中get请求与post请求编码统一问题(1.0)
  6. mysql glibc包很大_linux 安装 mysql 的 glibc 包
  7. 毕设题目:Matlab图像压缩
  8. 测绘类(遥感)投稿期刊(卓越期刊、EI、CSCD、核心期刊)汇总,内附投稿链接
  9. eclipse快捷方式打不开解决方法
  10. 两种excel 去掉公式保留数值的方法
  11. python使用金山词霸的翻译功能(调试工具断点的使用)
  12. 常见的系统漏洞安全扫描修复总结归纳
  13. 怎么去除新装修房子的甲醛
  14. 【LeetCode】86. 分隔链表
  15. 什么是内存屏障?具有什么作用?
  16. 一米OA漏洞学习——getfile.jsp 任意文件读取漏洞
  17. 【MySQL作业】分组查询 group by 子句——美和易思分组查询应用习题
  18. 等待时间 single-task message
  19. Python 中的三元运算符,三目表达式
  20. 学习方法推荐——快速阅读

热门文章

  1. 一张图学会python-一张图让你学会Python
  2. python用什么软件编程-初学python编程,有哪些不错的软件值得一用?
  3. 语音识别芯片原理是什么 语音识别芯片有哪些【详解】
  4. 语音识别技术在汽车上的应用
  5. mysql数据库对象管理_MySQL管理与优化(15):优化数据库对象
  6. 解决从登录页通过this.$router.push跳转首页后 点返回健路由变而页面不变的问题
  7. java oracle连接数据库_Java 连接 Oracle 数据库
  8. vue打包配置的详细说明【config/index.js的build部份】
  9. html5中defer的属性,HTML5中defer和async的比较
  10. mysql in memory_In-Memory:内存数据库