bzoj 3173: [Tjoi2013]最长上升子序列(离线二分+树状数组)
3173: [Tjoi2013]最长上升子序列
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 2051 Solved: 1041
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
Sample Output
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]最长上升子序列(离线二分+树状数组)相关推荐
- BZOJ 3173: [Tjoi2013]最长上升子序列
3173: [Tjoi2013]最长上升子序列 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1524 Solved: 797 [Submit][ ...
- [BZOJ]3173: [Tjoi2013]最长上升子序列
题解: 考虑按照元素升序加入 所以对位置在其后的元素LIS无影响 然后从前面位置的最大值转移过来就行 ,,,,平衡树无脑模拟 #include <algorithm> #includ ...
- 【BZOJ】3173: [Tjoi2013]最长上升子序列(树状数组)
[题意]给定ai,将1~n从小到大插入到第ai个数字之后,求每次插入后的LIS长度. [算法]树状数组||平衡树 [题解] 这是树状数组的一个用法:O(n log n)寻找前缀和为k的最小位置.(当数 ...
- BZOJ 2434 NOI2011阿狸的打字机 AC自动机+树状数组
如果你还没学AC自动机,请看这篇博客 Problem bzoj通道 洛谷通道 Solution 简单的说来,其实就是要快速求一个字符串在另一个字符串中出现了多少次.考虑构造AC自动机. 首先可以想到很 ...
- [BZOJ 3211]花神游历各国(并查集+树状数组)
Description Solution 树状数组单点修改区间查询 我们知道一个数n最多修改loglogn次就会变为1 并查集维护每个数右边第一个不为1的位置 #include<cstdio&g ...
- BZOJ 2716 [Violet 3]天使玩偶 (CDQ分治、树状数组)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2716 怎么KD树跑得都那么快啊..我写的CDQ分治被暴虐 做四遍CDQ分治,每次求一个 ...
- bzoj 1106: [POI2007]立方体大作战tet(贪心+树状数组)
1106: [POI2007]立方体大作战tet Time Limit: 10 Sec Memory Limit: 162 MB Submit: 785 Solved: 574 [Submit][ ...
- BZOJ3173 [TJOI2013]最长上升子序列
题面: 3173: [Tjoi2013]最长上升子序列 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 2108 Solved: 1067 [Sub ...
- 【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 ...
最新文章
- C#游戏开发快速入门教程Unity5.5教程
- fzu1062 洗牌问题(思路模拟)
- KMP算法的nextval[] 即优化next[]
- C++PrimerPlus学习——第十一章编程练习
- jsp中get请求与post请求编码统一问题(1.0)
- mysql glibc包很大_linux 安装 mysql 的 glibc 包
- 毕设题目:Matlab图像压缩
- 测绘类(遥感)投稿期刊(卓越期刊、EI、CSCD、核心期刊)汇总,内附投稿链接
- eclipse快捷方式打不开解决方法
- 两种excel 去掉公式保留数值的方法
- python使用金山词霸的翻译功能(调试工具断点的使用)
- 常见的系统漏洞安全扫描修复总结归纳
- 怎么去除新装修房子的甲醛
- 【LeetCode】86. 分隔链表
- 什么是内存屏障?具有什么作用?
- 一米OA漏洞学习——getfile.jsp 任意文件读取漏洞
- 【MySQL作业】分组查询 group by 子句——美和易思分组查询应用习题
- 等待时间 single-task message
- Python 中的三元运算符,三目表达式
- 学习方法推荐——快速阅读
热门文章
- 一张图学会python-一张图让你学会Python
- python用什么软件编程-初学python编程,有哪些不错的软件值得一用?
- 语音识别芯片原理是什么 语音识别芯片有哪些【详解】
- 语音识别技术在汽车上的应用
- mysql数据库对象管理_MySQL管理与优化(15):优化数据库对象
- 解决从登录页通过this.$router.push跳转首页后 点返回健路由变而页面不变的问题
- java oracle连接数据库_Java 连接 Oracle 数据库
- vue打包配置的详细说明【config/index.js的build部份】
- html5中defer的属性,HTML5中defer和async的比较
- mysql in memory_In-Memory:内存数据库