我也不知道为什么把题看成以插入点为结尾的最长生生子序列……还WA了好几次

先把这个序列最后的样子求出来,具体就是倒着做,用线段树维护点数,最开始所有点都是1,然后线段树上二分找到当前数的位置,把这个点标为0(相当于对于这之前的序列这个点是不存在的),把每个数的位置记为p[i]

然后用另一颗线段树维护每个位置上的LIS,根据时间序,每次插入数的时候求一下以他结尾的LIS然后放进线段树上对应的p[i](因为按照数从小到大所以直接查这个数位置之前的即可),然后再取全部点的max即可

#include<iostream>
#include<cstdio>
using namespace std;
const int N=100005;
int n,m,a[N],p[N],f[N];
struct xds
{
int l,r,s,mx;
}t[N<<2];
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
void jian(int ro,int l,int r)
{
t[ro].l=l,t[ro].r=r,t[ro].s=1;
if(l==r)
return;
int mid=(l+r)>>1;
jian(ro<<1,l,mid);
jian(ro<<1|1,mid+1,r);
t[ro].s=t[ro<<1].s+t[ro<<1|1].s;
}
int ef(int ro,int k)
{
if(t[ro].l==t[ro].r)
return t[ro].l;
if(t[ro<<1].s>=k)
return ef(ro<<1,k);
else
return ef(ro<<1|1,k-t[ro<<1].s);
}
void gai(int ro,int p)
{
if(t[ro].l==t[ro].r)
{
t[ro].s=0;
return;
}
int mid=(t[ro].l+t[ro].r)>>1;
if(p<=mid)
gai(ro<<1,p);
else
gai(ro<<1|1,p);
t[ro].s=t[ro<<1].s+t[ro<<1|1].s;
}
void build(int ro,int l,int r)
{
t[ro].l=l,t[ro].r=r,t[ro].mx=0;
if(l==r)
return;
int mid=(l+r)>>1;
build(ro<<1,l,mid);
build(ro<<1|1,mid+1,r);
}
int ques(int ro,int l,int r)
{
if(t[ro].l==l&&t[ro].r==r)
return t[ro].mx;
int mid=(t[ro].l+t[ro].r)>>1;
if(r<=mid)
return ques(ro<<1,l,r);
else if(l>mid)
return ques(ro<<1|1,l,r);
else
return max(ques(ro<<1,l,mid),ques(ro<<1|1,mid+1,r));
}
void update(int ro,int p,int v)
{
if(t[ro].l==t[ro].r)
{
t[ro].mx=v;
return;
}
int mid=(t[ro].l+t[ro].r)>>1;
if(p<=mid)
update(ro<<1,p,v);
else
update(ro<<1|1,p,v);
t[ro].mx=max(t[ro<<1].mx,t[ro<<1|1].mx);
}
int main()
{
n=read();
for(int i=1;i<=n;i++)
a[i]=read()+1;
jian(1,1,n);
for(int i=n;i>=1;i--)
{
p[i]=ef(1,a[i]);
gai(1,p[i]);
}
build(1,1,n);
for(int i=1;i<=n;i++)
{
int nw=ques(1,1,p[i])+1;
update(1,p[i],nw);
printf("%d\n",ques(1,1,n));
}
return 0;
}

bzoj 3173: [Tjoi2013]最长上升子序列【dp+线段树】的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. BZOJ 3173 [Tjoi2013] 最长上升子序列 解题报告

    这个题感觉比较简单,但却比较容易想残.. 我不会用树状数组求这个原排列,于是我只好用线段树...毕竟 Gromah 果弱马. 我们可以直接依次求出原排列的元素,每次找到最小并且最靠右的那个元素,假设这 ...

  7. BZOJ 3173: [Tjoi2013]最长上升子序列 (线段树+BIT)

    先用线段树预处理出每个数最终的位置.然后用BIT维护最长上升子序列就行了. 用线段树O(nlogn)O(nlogn)O(nlogn)预处理就直接倒着做,每次删去对应位置的数.具体看代码 CODE #i ...

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

    一眼切~ 重点是按照 $1$~$n$ 的顺序插入每一个数,这样的话就简单了. #include <cstdio> #include <algorithm> #define N ...

  9. bzoj千题计划316:bzoj3173: [Tjoi2013]最长上升子序列(二分+树状数组)

    https://www.lydsy.com/JudgeOnline/problem.php?id=3173 插入的数是以递增的顺序插入的 这说明如果倒过来考虑,那么从最后一个插入的开始删除,不会对以某 ...

随机推荐

  1. dm8127/8148下怎样进行dsplink的编写

    样例:从A8读入1080p的yuv420sp的数据给dsplink,在dsp 中建立一个link(做一些图像处理的工作).然后将yuv420sp的数据发送到videoM3做jpeg编码,然后在传递到A ...

  2. iOS多线程编程指南

    iOS多线程编程指南(拓展篇)(1) 一.Cocoa 在Cocoa上面使用多线程的指南包括以下这些: (1)不可改变的对象一般是线程安全的.一旦你创建了它们,你可以把这些对象在线程间安全的传递.另一方 ...

  3. Arcgis Engine(ae)接口详解(6):workspace操作

    //此处用的workspace来源与用户选择 IWorkspace workspace = null; //workspace一般等同于数据库 //工作空间类型,也可理解为数据库类型 //esriFi ...

  4. Android如果动态改变CursorAdapter Item个数

    //adapter内部类 private class SearchAdapter extends CursorAdapter { @Override public View newView(Conte ...

  5. hibernate 的分页查询

    hibernate的分页查询有个好处,就是不用管数据库方言.比如db2的分页查询很麻烦,但是用hibernate的方式,就完全不用管这些了 /* 使用HQL分页查询Customer信息 */ publ ...

  6. Java Management Extensions (JMX) Flume

    Lesson: Overview of the JMX Technology (The Java™ Tutorials > Java Management Extensions (JMX)) h ...

  7. Cluster Mode Overview

    https://spark.apache.org/docs/latest/cluster-overview.html

  8. oracle中去掉文本中的换行符、回车符、制表符

    一.特殊符号ascii定义 制表符 chr(9)  换行符 chr(10) 回车符 chr(13) UPDATE tc_car_order set USE_REASON =  REPLACE('USE ...

  9. ZOJ3209 Treasure Map —— Danc Links 精确覆盖

    题目链接:https://vjudge.net/problem/ZOJ-3209 Treasure Map Time Limit: 2 Seconds      Memory Limit: 32768 ...

  10. 如何使用BMap.Point传递变量、存储数据?

    在开发中使用到了百度地图进行开发,用于展示企业位置.由于数据量庞大,如果使用marker,将会造成界面卡顿,处理慢的问题. 在查看百度地图API示例是发现了海量点这个东西,还别说对于大数量的点加载起来 ...