3173: [Tjoi2013]最长上升子序列
原题:http://www.lydsy.com/JudgeOnline/problem.php?id=3173
题解:促使我写这题的动力是,为什么百度遍地是Treap,黑人问号???
这题可以用线段树做。我们知道,插入一个数只会使答案变大1或不变。用线段树维护长度为i的最长上升子序列末尾的位置。每插入一个数,可以在线段树中找出插入位置,然后更新即可。
#include <bits/stdc++.h>
#define N 100006
using namespace std;
int n,m,x,y,tot,f[N],s[10*N],flag[10*N];
inline int read()
{
int x=0,c=getchar();while(c<'0'||x>'9')c=getchar();
while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+c-48,c=getchar();return x;
}
void down(int x)
{
if(flag[x]){
flag[x<<1]+=flag[x];
flag[x<<1|1]+=flag[x];
s[x]+=flag[x];
flag[x]=0;
}
}
void change(int i,int l,int r,int x,int y)
{
down(i);down(i<<1);down(i<<1|1);
if(l==r){s[i]=y;return;}
int mid=(l+r)>>1;
if(x<=mid)change(i<<1,l,mid,x,y);
else change(i<<1|1,mid+1,r,x,y);
s[i]=max(s[i<<1],s[i<<1|1]);
}
void add(int i,int l,int r,int x,int y)
{
down(i);down(i<<1);down(i<<1|1);
if(x<=l&&r<=y){flag[i]++;down(i);return;}
int mid=(l+r)>>1;
if(x<=mid)add(i<<1,l,mid,x,y);
if(y>mid)add(i<<1|1,mid+1,r,x,y);
s[i]=max(s[i<<1],s[i<<1|1]);
}
int query(int i,int l,int r,int x)
{
down(i);down(i<<1);down(i<<1|1);
if(l==r)return s[i];
int mid=(l+r)>>1;
if(x<=mid)return query(i<<1,l,mid,x);
return query(i<<1|1,mid+1,r,x);
}
int ask(int x)
{
int l=0,r=tot,ans=0;
while(l<=r){
int mid=(l+r)>>1;
if(query(1,1,n,mid)<=x)ans=mid,l=mid+1;
else r=mid-1;
}
return ans;
}
int main()
{
n=read();
x=read();tot=1;
change(1,1,n,1,1);
printf("1\n");
for(int i=2;i<=n;i++){
x=read();
int tmp=ask(x);
if(tmp<tot)add(1,1,n,tmp+1,tot);
change(1,1,n,tmp+1,x+1);
tot=max(tot,tmp+1);
printf("%d\n",tot);
}
}
3173: [Tjoi2013]最长上升子序列的更多相关文章
- BZOJ 3173: [Tjoi2013]最长上升子序列
3173: [Tjoi2013]最长上升子序列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1524 Solved: 797[Submit][St ...
- Bzoj 3173: [Tjoi2013]最长上升子序列 平衡树,Treap,二分,树的序遍历
3173: [Tjoi2013]最长上升子序列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1183 Solved: 610[Submit][St ...
- BZOJ 3173: [Tjoi2013]最长上升子序列( BST + LIS )
因为是从1~n插入的, 慢插入的对之前的没有影响, 所以我们可以用平衡树维护, 弄出最后的序列然后跑LIS就OK了 O(nlogn) --------------------------------- ...
- BZOJ 3173: [Tjoi2013]最长上升子序列 [splay DP]
3173: [Tjoi2013]最长上升子序列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1613 Solved: 839[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]最长上升子序列(树状数组)
[题意]给定ai,将1~n从小到大插入到第ai个数字之后,求每次插入后的LIS长度. [算法]树状数组||平衡树 [题解] 这是树状数组的一个用法:O(n log n)寻找前缀和为k的最小位置.(当数 ...
- bzoj 3173: [Tjoi2013]最长上升子序列【dp+线段树】
我也不知道为什么把题看成以插入点为结尾的最长生生子序列--还WA了好几次 先把这个序列最后的样子求出来,具体就是倒着做,用线段树维护点数,最开始所有点都是1,然后线段树上二分找到当前数的位置,把这个点 ...
随机推荐
- 【python】安装python第三方库lxml时,遇到问题:[ERROR: 'xslt-config' 不是内部或外部命令,也不是可运行的程序]
一.概述 lxml介绍http://lxml.de/ 二.问题 ERROR: 'xslt-config' 不是内部或外部命令,也不是可运行的程序 三.解决方法 Scrapy在Windows上的安装笔记 ...
- Socket聊天室-TcpListener,TcpClient
参考自:http://blog.csdn.net/liguo9860/article/details/6148614 服务端:
- canvas中的rotate的使用方法
今天在绘制一个足球滚动的时候,想使用rotate方法,之前看到这个方法的时候,并没有引起任何重视,无非就是和CSS3里的rotate一样的用么... 遗憾的是,事实并非如此,由于代码在公司,我也就不去 ...
- words
conscious[英][ˈkɒnʃəs][美][ˈkɑnʃəs]consensus[英][kənˈsensəs][美][kənˈsɛnsəs] scious sensuswaterflood; de ...
- JavaScript Array 常用函数整理
按字母顺序整理 索引 Array.prototype.concat() Array.prototype.filter() Array.prototype.indexOf() Array.prototy ...
- chrome 'adobe flash player 已过期'解决方法
http://labs.adobe.com/downloads/flashplayer.html下载 WindowsDownload Flash Player for Opera and Chromi ...
- JPA 2.1 Coverter 注解
@Converter(autoApply = true) public class VehicleConverter implements AttributeConverter<Vehicle, ...
- win7 WindowsImageBackup 无法识别
控制面板\所有控制面板项\备份和还原
- 使用"关键词"来整理自己的知识库
以前一直使用MyBase作为整理知识的工具,但是用到后来发现,当整理的知识越来越多时,树形目录的节点个数就会变得越来越庞大,层次越来越深,反而很难定位要查看或编辑的知识.最近发现使用"关键字 ...
- 基于 Token 的身份验证方法
使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录.大概的流程是这样的: 客户端使用用户名跟密码请求登录 服务端收到请求,去验证用户名与密码 验证成功后,服务端会签发一个 Toke ...