其实是一道性质题。

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

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

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

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

也就是说,插入一个数时,因为它后面的数都比它小,所以不会对后面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. Ubuntu 14.04 登录 界面添加 root账号

    1打开终端输入:sudo gedit /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf 2在弹出的编辑框里加入:greeter-show-manual- ...

  2. 浅析Win8/8.1下安装SQL Server 2005 出现服务项无法正常启动解决方案

    如何才能在微软最新的Windows8/Windows 8.1下正常使用SQL Server 2005套件呢?下面就简单介绍利用文件替换法,解决其服务项无法正常启动的临时方案.当然还是建议使用SQL S ...

  3. react-native android 初始化问题

    最近开始接触rn,官方起手,装了一堆工具,然后启动项目的时候出现了一堆问题,这里针对我遇到的一些问题提供一些解决方案. 本人开发环境mac,在启动ios的时候没啥大问题,可以直接启动,这里提示一点,因 ...

  4. 请求头(request)和响应头(response)

    说一说常见的请求头和相应头都有什么呢? 1)请求(客户端->服务端[request]) GET(请求的方式) /newcoder/hello.html(请求的目标资源) HTTP/1.1(请求采 ...

  5. centos7下搭建django

    安装环境:centos7.4 1 安装nginx yum install nginx 注:尝试过在本地和腾讯云上安装,使用同一条命令:在本地安装提示没有可用安装包,云上安装正常 启动nginx,并启用 ...

  6. C 计算员工工资

    #include <stdio.h> int main(int argc, char **argv) { //定义四个变量 g每小时固定的工资 40 固定工作时间 pay工资 hours员 ...

  7. 【springmvc+mybatis项目实战】杰信商贸-2.数据库配置

    首先我们来了解项目的架构 我们分别使用了MySql和Oracle数据库,即是异构数据库.我们做到一个平台支持多个数据库.数据库建模我们使用Sybase公司的PowerDesigner(以后简称PD), ...

  8. Halcon10 下载

    Halcon10 下载地址:http://www.211xun.com/download_page_1.html HALCON 10 是一套机器视觉图像处理库,由一千多个算子以及底层的数据管理核心构成 ...

  9. @Configuration和@Bean

    @Configuration可理解为用spring的时候xml里面的标签 @Bean可理解为用spring的时候xml里面的标签 Spring Boot不是spring的加强版,所以@Configur ...

  10. ElasticSearch 论坛搜索查询语句

    概述 研究论坛搜索如何综合时间和TF/IDF权重. 自定义权重计算的效率问题 数据结构 假设有一个论坛的搜索 字段包括: subject:标题 message:内容 dateline:发布时间 tag ...