题面:

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

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 2108  Solved: 1067
[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

HINT

100%的数据 n<=100000

既然插入的数从小到大,我们就可以搞出最终的序列求LIS。

ans[i]=max{f[j],(1<=j<=i)},f[i]表示插入i后以i为结尾LIS长度。

只要求出最终序列问题就解决了。

可以用平衡树(Treap或Splay)

但是转化为前缀k小后就可以用树状数组求辣!(树状数组求k小值?)

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 #include <algorithm>
 5 #include <math.h>
 6 using namespace std;
 7 #define maxn 100001
 8 #define lowbit(x) (x&(-x))
 9 template<typename __>
10 inline void read(__ &s)
11 {
12     char ch;
13     for(ch=getchar(),s=0;ch<'0'||ch>'9';ch=getchar());
14     for(;ch>='0'&&ch<='9';s=s*10+ch-'0',ch=getchar());
15 }
16 int n;
17 class fenwick
18 {
19     public:
20         int c[maxn];
21         void update_sum(int x,int val)
22         {
23             for(;x<=n;x+=lowbit(x))
24                 c[x]+=val;
25         }
26         void update_max(int x,int val)
27         {
28             for(;x<=n;x+=lowbit(x))
29                 c[x]=max(c[x],val);
30         }
31         int query_kth(int k)
32         {
33             int cnt=0,ans=0;
34             for(int i=17;i>=0;i--)
35             {
36                 ans+=(1<<i);
37                 if(ans>=n||cnt+c[ans]>=k)
38                     ans-=(1<<i);
39                 else
40                     cnt+=c[ans];
41             }
42             return ans+1;
43         }
44         int query_max(int x)
45         {
46             int ans=0;
47             for(;x;x-=lowbit(x))
48                 ans=max(ans,c[x]);
49             return ans;
50         }
51 }T;
52 int QWQ[maxn],QAQ[maxn],f[maxn];
53 int main()
54 {
55     read(n);
56     for(int i=1;i<=n;i++)
57     {
58         read(QWQ[i]);
59         ++T.c[i];
60         if((i+lowbit(i))<=n)
61             T.c[i+lowbit(i)]+=T.c[i];
62     }
63     int tmp;
64     for(int i=n;i>=1;i--)
65     {
66         QAQ[tmp=T.query_kth(QWQ[i]+1)]=i;
67         T.update_sum(tmp,-1);
68     }
69     memset(T.c,0,sizeof(T.c));
70     for(int i=1;i<=n;i++)
71     {
72         f[QAQ[i]]=T.query_max(QAQ[i])+1;
73         T.update_max(QAQ[i],f[QAQ[i]]);
74     }
75     for(int i=1;i<=n;i++)
76         printf("%d\n",f[i]<f[i-1]?(f[i]=f[i-1]):f[i]);
77 }

BZOJ 3173

转载于:https://www.cnblogs.com/radioteletscope/p/7762177.html

BZOJ3173 [TJOI2013]最长上升子序列相关推荐

  1. [BZOJ3173][Tjoi2013]最长上升子序列

    [BZOJ3173][Tjoi2013]最长上升子序列 试题描述 给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数字,我们都想知道此时最长上 ...

  2. BZOJ3173:[TJOI2013]最长上升子序列(Splay)

    Description 给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数字,我们都想知道此时最长上升子序列长度是多少? Input 第一行一 ...

  3. bzoj3173: [Tjoi2013]最长上升子序列(fhqtreap)

    这题用fhqtreap可以在线. fhqtreap上维护以i结尾的最长上升子序列,数字按从小到大加入, 因为前面的数与新加入的数无关, 后面的数比新加入的数小, 所以新加入的数对原序列其他数的值没有影 ...

  4. [TJOI2013]最长上升子序列

    [TJOI2013]最长上升子序列 题目大意: 给定一个序列,初始为空.将\(1\sim n(n\le10^5)\)的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数字后输出LIS长 ...

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

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

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

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

  7. P4309 [TJOI2013]最长上升子序列 平衡树 + dp

    传送门 文章目录 题意: 思路: 题意: 思路: 注意到一个很关键的条件,每次插入iii,而iii是递增的,也就是说插入iii之后只会从前面的最大值转移过来,所以我们现在只需要维护插入操作即可,这个显 ...

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

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

  9. 【bzoj 3173】[Tjoi2013]最长上升子序列

    Description 给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数字,我们都想知道此时最长上升子序列长度是多少? Input 第一行一 ...

最新文章

  1. chrome Native Client 让你可以使用 C 以及 C++ 语言开发 Web 应用
  2. 从本地上传项目到 github 以及从github 下载项目到本地环境
  3. SpringCloud动态获取yml文件里面的自定义配置
  4. 利用go语言创建web server的两种方式
  5. step1 . day4 C语言基础练习之日历
  6. 2021计算机应用基础统考,2021年度计算机应用基础统考练习题及答案.doc
  7. java jvm内存地址_JVM--Java内存区域
  8. 集成学习——XGBoost原理理解
  9. sql server序列_SQL Server中的序列对象功能
  10. 《HTML5+JavaScript动画基础》——2.4 JavaScript对象
  11. 悟空学Linux专栏----第3篇
  12. [JSOI2012]玄武密码 题解(AC自动机)
  13. python安卓手机编程入门自学_编程入门学习路线(附教程推荐)
  14. window java 一键启动部署 mysql,jar
  15. 电脑如何截长图?如何用电脑截取长图——规划全景
  16. 總結——關於2017 10 30測試的分析總結
  17. 《歌手》2019歌王之战红毯众星云集 总决赛选曲透玄机
  18. 作为一名程序员,你觉得最重要的能力是什么?
  19. mysql计算两个月份之间的差值_MySQL计算两个日期相差的天数、月数、年数
  20. 飞翔的小鸟1.0 JAVA

热门文章

  1. 多客服功能终于也向所有微信认证的订阅号开放了
  2. BDB (Berkeley DB)数据库简单介绍(转载)
  3. cufon,在网页上画出特殊字体
  4. linux 双网卡绑定(bonding)实现负载均衡或故障转移
  5. 公司要禁止QQ?【我们从协议开始分析】
  6. argsort获得排序后的下标
  7. kafka报错与调试技巧
  8. Flink1.12 standalone-HA配置(转载+自己验证)
  9. 0009:err:listview:LISTVIEW_WindowProc unknown msg 108c问题解决
  10. 图解比较李航书上的viterbi算法和dijistra算法