bzoj 3173: [Tjoi2013]最长上升子序列【dp+线段树】
我也不知道为什么把题看成以插入点为结尾的最长生生子序列……还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+线段树】的更多相关文章
- BZOJ 3173: [Tjoi2013]最长上升子序列 [splay DP]
3173: [Tjoi2013]最长上升子序列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1613 Solved: 839[Submit][St ...
- BZOJ 3173: [Tjoi2013]最长上升子序列
3173: [Tjoi2013]最长上升子序列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1524 Solved: 797[Submit][St ...
- BZOJ 3173: [Tjoi2013]最长上升子序列( BST + LIS )
因为是从1~n插入的, 慢插入的对之前的没有影响, 所以我们可以用平衡树维护, 弄出最后的序列然后跑LIS就OK了 O(nlogn) --------------------------------- ...
- Bzoj 3173: [Tjoi2013]最长上升子序列 平衡树,Treap,二分,树的序遍历
3173: [Tjoi2013]最长上升子序列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1183 Solved: 610[Submit][St ...
- bzoj 3173 [Tjoi2013]最长上升子序列 (treap模拟+lis)
[Tjoi2013]最长上升子序列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2213 Solved: 1119[Submit][Status] ...
- BZOJ 3173 [Tjoi2013] 最长上升子序列 解题报告
这个题感觉比较简单,但却比较容易想残.. 我不会用树状数组求这个原排列,于是我只好用线段树...毕竟 Gromah 果弱马. 我们可以直接依次求出原排列的元素,每次找到最小并且最靠右的那个元素,假设这 ...
- BZOJ 3173: [Tjoi2013]最长上升子序列 (线段树+BIT)
先用线段树预处理出每个数最终的位置.然后用BIT维护最长上升子序列就行了. 用线段树O(nlogn)O(nlogn)O(nlogn)预处理就直接倒着做,每次删去对应位置的数.具体看代码 CODE #i ...
- BZOJ 3173: [Tjoi2013]最长上升子序列 Splay
一眼切~ 重点是按照 $1$~$n$ 的顺序插入每一个数,这样的话就简单了. #include <cstdio> #include <algorithm> #define N ...
- bzoj千题计划316:bzoj3173: [Tjoi2013]最长上升子序列(二分+树状数组)
https://www.lydsy.com/JudgeOnline/problem.php?id=3173 插入的数是以递增的顺序插入的 这说明如果倒过来考虑,那么从最后一个插入的开始删除,不会对以某 ...
随机推荐
- Bean property XX' is not writable or has an invalid setter method
刚刚搞spring.property注入时遇到这个问题,百度一下.非常多人说是命名或者get set方法不一致的问题,可是这个我是知道的.写的时候也注意到这些.所以应该不是这个问题.以为是xml头写的 ...
- Metasploit学习笔记之——情报搜集
1.情报搜集 1.1外围信息搜索 1.1.1通过DNS和IP地址挖掘目标网络信息 (1)whois域名注冊信息查询(BT5.kali专有):root@kali:~# whois testfire.ne ...
- 翻译:A Tutorial on the Device Tree (Zynq) -- Part V
A Tutorial on the Device Tree (Zynq) -- Part V Application-specific data 之前提过,设备树中是一些特殊信息,这样一个驱动可以管理 ...
- Handler之IdleHandler
MessageQueue提供了另一类消息,IdleHandler 如果返回false,每次轮询都会调用(理论上应该可以做一些别的东西) Looper.myQueue().addIdleHandler( ...
- POJ 2586 Y2K Accounting Bug(枚举大水题)
Y2K Accounting Bug Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10674 Accepted: 53 ...
- java的gradle项目的基本配置
plugins { id 'org.springframework.boot' version '2.1.4.RELEASE' id 'java' } apply plugin: 'io.spring ...
- JavaScript and ActionScript3
接触JavaScript和ActionScript3也有一段时间了,它们都是应用比较广泛的脚本语言,经过这几年的工作和学习,静下来的时候想总结一些东西,作为技术上的沉淀以及培训所用,所以就有了这篇文章 ...
- php与html 表单的结合
PHP $_POST <!DOCTYPE html> <html> <body> <form method="post" action=& ...
- Spring Boot2.0之 整合Redis集群
项目目录结构: pom: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http:// ...
- async-await系列翻译(一)
本篇翻译的英文链接:https://docs.microsoft.com/en-us/dotnet/articles/standard/async-in-depth 使用.NET的基于任务的异步编程模 ...