原题: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]最长上升子序列的更多相关文章

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

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

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

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

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

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

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

    3173: [Tjoi2013]最长上升子序列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1613  Solved: 839[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]最长上升子序列(树状数组)

    [题意]给定ai,将1~n从小到大插入到第ai个数字之后,求每次插入后的LIS长度. [算法]树状数组||平衡树 [题解] 这是树状数组的一个用法:O(n log n)寻找前缀和为k的最小位置.(当数 ...

  9. bzoj 3173: [Tjoi2013]最长上升子序列【dp+线段树】

    我也不知道为什么把题看成以插入点为结尾的最长生生子序列--还WA了好几次 先把这个序列最后的样子求出来,具体就是倒着做,用线段树维护点数,最开始所有点都是1,然后线段树上二分找到当前数的位置,把这个点 ...

随机推荐

  1. 使用BigDecimal进行精确运算以及格式化输出数字

    一.引言    借用<Effactive Java>这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供 ...

  2. poj1007-DNA Sorting(排序)

    一,题意: 输入N个字符串,按照字符串的逆序数由最少到最大开始输出. 注意:如果逆序数相同,就原来顺序输出. 二,思路步骤: 1,输入,并用a[]存储每行字符串的逆序数; 2,冒泡排序a[]的同时换掉 ...

  3. maxscale

    一.maxscale简介1.MaxScale是maridb开发的一个mysql数据中间件,其配置简单,能够实现读写分离,并且可以根据主从状态实现写库的自动切换.2.官网:https://mariadb ...

  4. java中Collections.sort排序详解

    Comparator是个接口,可重写compare()及equals()这两个方法,用于比价功能:如果是null的话,就是使用元素的默认顺序,如a,b,c,d,e,f,g,就是a,b,c,d,e,f, ...

  5. J2SE核心开发实战

    原图链接:http://naotu.baidu.com/file/7e3fb5d333b8cb665038390617834559?token=3c3c9d183944dd8e 课程来源:https: ...

  6. Git & Gitlab 使用指南

    2016-02-23   |   9,129字   |   分类于 工具  |   3条评论 去年小组在从 SVN 和 TFS 迁移到 Git 的过程中整理了这份文档,面向的用户是对 Git 和 SV ...

  7. idea 光标变成粗体且当前文件搜索功能无法使用的问题

    今天安装了idea最新版,安装完成后发现光标变成了粗体,并且快捷键在使用时出现了问题,比如:ctrl+F搜索功能无法使用 经过反复修改配置也无法改善情况,后来一次重启看到下面小窗弹出有关vim的一个提 ...

  8. 弱网测试IOS

    IOS测弱网非常方便,在设置-开发者-NETWORK LINK CONDITIONER的Status 进入后可以看到IOS自带了100%LOSS.3G.WiFi等常见场景 可以点击图标i进行查看或编辑 ...

  9. vim - save current file with a new name but keep editing current file

    http://superuser.com/questions/414110/vim-save-a-file-as-a-different-filename-but-keep-w-as-the-curr ...

  10. 【尝新】微信小程序初体验

    文档地址:https://mp.weixin.qq.com/debug/wxadoc/dev/?t=1474644089434 根据文档地址中下载微信开发工具后,按照文档指引可以创建一个快速体验的小d ...