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,然后线段树上二分找到当前数的位置,把这个点 ...
随机推荐
- JavaScript之数组方法整理
Array概述 除了Object类型,最常用的类型: 实质:有序的数据列表, 特性:可以动态的调整数组的大小 创建数组的两种方式 构造函数创建方式 var arr = ...
- vb6保存项目到c盘的安装目录
工程保存在安装目录("C:\Program Files (x86)\Microsoft Visual Studio\VB98\errhandler1.vbp")里. 文件管理器找不 ...
- Vue.js起手式+Vue小作品实战
本文是小羊根据Vue.js文档进行解读的第一篇文章,主要内容涵盖Vue.js的基础部分的知识的,文章顺序基本按照官方文档的顺序,每个知识点现附上代码,然后根据代码给予个人的一些理解,最后还放上在线编辑 ...
- 【转】jquery.cookie.js的使用
Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是 ...
- poj3740
#include<stdio.h>#include<iostream>int map[16][300];int vistx[16];int visty[300];int zhe ...
- (转)微信小程序破解IDE
1.IDE下载 微信web开发者工具,本人是用的windows 10 x64系统,用到以下两个版本的IDE安装工具与一个破解工具包: wechat_web_devtools_0.7.0_x64.exe ...
- java常见面试题及答案 11-20(JVM篇)
11.JVM内存分哪几个区,每个区的作用是什么? Java虚拟机主要分为以下一个区: 方法区:1. 有时候也成为永久代,在该区内很少发生垃圾回收,但是并不代表不发生GC,在这里进行的GC主要是对方法区 ...
- 另一种在WINFORM中使用XNA的方法
之前在写化学分子模型制作程序的时候,使用一种方法,将WINFORM控件嵌入到XNA窗体中,从而实现了即使用WINFORM窗体控件又使用XNA.最近在写另一个物理运动学课件制作程序,同样使用XNA,但从 ...
- php token的生成
转载自:http://blog.snsgou.com/post-766.html --->非开放性平台 --->公司内部产品 接口特点汇总: 1.因为是非开放性的,所以所有的接口都是封闭的 ...
- Xcode清除缓存等
Xcode出现一些错误的时候,有时候不是代码的问题,需要清理一下Xcode的缓存或者项目的Product等: 1. Product清理 1.1 Product-Clean 1.2 Product- ...