其实是一道性质题。

首先观察到插入的数是递增的,

那么根据上升子序列的性质,

我们的非法情况就是统计到了在一个数前面的后插入的数,

但是由于插入的数是递增的,显然插入这个数后,这个数就是最大的,所以除了它自己,不会有任何数统计到它,

也就是说,插入一个数时,因为它后面的数都比它小,所以不会对后面DP值产生影响,

而显然它也是不会对它前面的数产生影响的,

因此插入操作实质上是一种无效操作。

所以我们只需要得到最终序列,然后直接dp得到以每个数为结尾的最长上升子序列,

然后统计答案的时候按照数的大小输出前缀max即可。

#include<bits/stdc++.h>
#include<ext/rope>
using namespace std;
using namespace __gnu_cxx;
#define R register int
#define AC 110000
#define getchar() *o++
char READ[],*o=READ;
int n,tot,maxn;
int s[AC],d[AC],ans[AC];
rope <int> tmp;
/*这大概是一道很妙的观察性质题吧,,,
可以观察到,对于插入任意一个数而言,不管插在哪里,对它前面的DP值是不会产生影响的,
而由于插入的数是递增的,所以插入这个数时,这个数自己就是当前数列里最大的那一个,
所以对后面的DP值也不会产生影响,所以其实只需要得到最后的序列直接DP即可以了,因为插入是无效的。 换句话来说,就是因为直接对最后序列查询得到的是不合法结果,当且仅当这个数的DP值中利用到了
在这个数前面的,且在它后面插入的数。而对于这道题而言,在它后面插入的数都比它大,
所以插在前面肯定查询不到,而插在后面自然也查不到了,所以直接做就好了 那如何处理输出问题呢?
因为时间顺序就是数字大小,因此把每个位置的DP值放入对应的数字大小里,然后前缀取max就可以了
*/
inline int read()
{
int x=;char c=getchar();
while(c > '' || c < '') c=getchar();
while(c >= '' && c <= '') x=x*+c-'',c=getchar();
return x;
} void pre()
{
n=read();
for(R i=;i<=n;i++)
{
int a=read();
tmp.insert(a,i);
}
//printf("!!!");
for(R i=;i<=n;i++)
{
// printf("%d\n",i);
s[i]=tmp.at(i-);
// if(s[i] == 1) printf("!!!%d\n",i);
}
} void half(int x)
{
int l=,r=tot,mid;
while(l < r)
{
mid=(l + r) >> ;
if(d[mid] > x) r=mid;//因为这里直接转移是保护了信息的,因此寻找第一个大于x的数
else l=mid+;
}
d[l]=x;
ans[x]=l;
}
//这种二分所利用的单调性实质上是因为前面被放入的后面一定可以用?
void work()
{
//for(R i=1;i<=n;i++) printf("%d ",s[i]);
//printf("\n");
for(R i=;i<=n;i++)
{
if(s[i] > d[tot]) d[++tot]=s[i],ans[s[i]]=tot;
else if(s[i] < d[]) d[]=s[i],ans[s[i]]=;//error!!!放入第一个ans当然=1了
else half(s[i]);
//ans[s[i]]=tot;//ans[s[i]]代表放入了s[i]后的最大ans,error 不能在这里就改最大ans,因为会统计到大于s[i]的ans
//error!!!但还是要前缀和取max,因为这个只是统计到了s[i]的ans,还要考虑比s[i]小的数(之前插入)的ans
//因为比s[i]小的数位置可能在右边,这个时候还没有统计到
}//error!!!注意是存入对应的值所在位置
for(R i=;i<=n;i++)
{
maxn=max(maxn,ans[i]);
printf("%d\n",maxn);
}
} int main()
{
// freopen("in.in","r",stdin);
fread(READ,,,stdin);
pre();
work();
// fclose(stdin);
return ;
}

[TJOI2013]最长上升子序列 平衡树的更多相关文章

  1. Bzoj 3173: [Tjoi2013]最长上升子序列 平衡树,Treap,二分,树的序遍历

    3173: [Tjoi2013]最长上升子序列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1183  Solved: 610[Submit][St ...

  2. bzoj3173[Tjoi2013]最长上升子序列 平衡树+lis

    3173: [Tjoi2013]最长上升子序列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2253  Solved: 1136[Submit][S ...

  3. BZOJ 3173: [Tjoi2013]最长上升子序列( BST + LIS )

    因为是从1~n插入的, 慢插入的对之前的没有影响, 所以我们可以用平衡树维护, 弄出最后的序列然后跑LIS就OK了 O(nlogn) --------------------------------- ...

  4. BZOJ_3173_[Tjoi2013]最长上升子序列_splay

    BZOJ_3173_[Tjoi2013]最长上升子序列_splay Description 给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数 ...

  5. 【LG4309】【BZOJ3173】[TJOI2013]最长上升子序列

    [LG4309][BZOJ3173][TJOI2013]最长上升子序列 题面 洛谷 BZOJ 题解 插入操作显然用平衡树就行了 然后因为后面的插入对前面的操作无影响 就直接在插入完的序列上用树状数组求 ...

  6. bzoj 3173 [Tjoi2013]最长上升子序列 (treap模拟+lis)

    [Tjoi2013]最长上升子序列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2213  Solved: 1119[Submit][Status] ...

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

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

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

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

  9. BZOJ 3173: [Tjoi2013]最长上升子序列 [splay DP]

    3173: [Tjoi2013]最长上升子序列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1613  Solved: 839[Submit][St ...

随机推荐

  1. Unity2017 经典游戏开发教程 算法分析与实现 (张帆 著)

    https://meta.box.lenovo.com/link/view/82c451b41ce34e81a4b34cb46747d3d5 第1章 熟悉Unity软件的操作 第2章 打地鼠 (已看) ...

  2. 说一说VIN码识别,车架号识别那些事

    对于有车一族的朋友来说,日常接触比较多的是车牌.行驶证.驾驶证,而知道VIN码/车架号码的比较少. 其实,对于车辆来说,VIN码/车架号码非常重要,它就像人的身份证一样,VIN码/车架号码是车辆唯一的 ...

  3. Java开发工程师(Web方向) - 04.Spring框架 - 第4章.数据访问

    第4章--数据访问 Spring JDBC DAO (Data Access Object) 实现数据访问相关接口(接口和实现分离) ORM (Object Relation Mapping) 对象关 ...

  4. [CodeForce455A]Boredom

    题面描述 Alex doesn't like boredom. That's why whenever he gets bored, he comes up with games. One long ...

  5. 【cover-view、cover-image】 覆盖组件说明

    cover-view.cover-image 这两类覆盖组件用于显示在一些特殊组件上方(map.video.canvas.camera.live-player.live-pusher). 这类组件一般 ...

  6. javascript常用对象方法

    concat:连接产生一个新数组 [1,2].concat([3,4])     >> [1, 2, 3, 4] filter:返回符合条件的一个新数组 [1,2,3,4,5].filte ...

  7. leetcode-三数之和(java)

     三数之和     给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可 ...

  8. 面试应该get这三大技能

    链接:https://www.nowcoder.com/discuss/84391?type=0&order=3&pos=16&page=0 一.自我介绍凸显学业背景中的隐含信 ...

  9. jquery datatable 常用例子

    在项目中经常用到DataTable,如果DataTable使用得当,不仅能使程序简洁实用,而且能够提高性能,达到事半功倍的效果,现对DataTable的使用技巧进行一下总结. 一.DataTable简 ...

  10. svn服务器 备份,迁移,部署方案

    这次做业务迁移,要从一个云厂商迁移到某云厂商,之前每天到全备svn排到用场了,需要搭建一个全新到svn服务并要做迁移,并实现我们开发机到时时代码同步 一.svn备份有很多种,优劣都不同,百度可查,我采 ...