博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[TJOI2013]最长上升子序列
阅读量:6570 次
发布时间:2019-06-24

本文共 3118 字,大约阅读时间需要 10 分钟。

[TJOI2013]最长上升子序列

题目大意:

给定一个序列,初始为空。将\(1\sim n(n\le10^5)\)的数字插入到序列中,每次将一个数字插入到一个特定的位置。每插入一个数字后输出LIS长度。

思路:

首先用线段树(或rope)求出最终状态的序列,然后就变成了普通的LIS问题。

源代码:

线段树:

#include
#include
#include
inline int getint() { register char ch; while(!isdigit(ch=getchar())); register int x=ch^'0'; while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0'); return x;}const int N=1e5+1;int n,p[N];class SegmentTree { #define _left <<1 #define _right <<1|1 #define mid ((b+e)>>1) private: int val[N<<2]; void push_up(const int &p) { val[p]=val[p _left]+val[p _right]; } public: int find(const int &p,const int &b,const int &e,const int &x) { if(b==e) return x==b-val[p]?b:0; if(mid-val[p _left]<=x) { const int ret=find(p _right,mid+1,e,x+val[p _left]); if(ret) return ret; } return find(p _left,b,mid,x); } void add(const int &p,const int &b,const int &e,const int &x) { val[p]++; if(b==e) return; if(x<=mid) add(p _left,b,mid,x); if(x>mid) add(p _right,mid+1,e,x); push_up(p); } #undef _left #undef _right #undef mid};SegmentTree sgt;class FenwickTree { private: int val[N]; int lowbit(const int &x) const { return x&-x; } public: void modify(int p,const int &x) { for(;p<=n;p+=lowbit(p)) { val[p]=std::max(val[p],x); } } int query(int p) const { int ret=0; for(;p;p-=lowbit(p)) { ret=std::max(ret,val[p]); } return ret; }};FenwickTree bit;int main() { n=getint(); for(register int i=1;i<=n;i++) { p[i]=getint(); } for(register int i=n;i>=1;i--) { p[i]=sgt.find(1,1,n,p[i])+1; sgt.add(1,1,n,p[i]); } int ans=0; for(register int i=1;i<=n;i++) { const int tmp=bit.query(p[i])+1; bit.modify(p[i],tmp); ans=std::max(ans,tmp); printf("%d\n",ans); } return 0;}

rope

#include
#include
#include
inline int getint() { register char ch; while(!isdigit(ch=getchar())); register int x=ch^'0'; while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0'); return x;}const int N=1e5+1;int n,ans[N];__gnu_cxx::rope
s;class FenwickTree { private: int val[N]; int lowbit(const int &x) const { return x&-x; } public: void modify(int p,const int &x) { for(;p<=n;p+=lowbit(p)) { val[p]=std::max(val[p],x); } } int query(int p) const { int ret=0; for(;p;p-=lowbit(p)) { ret=std::max(ret,val[p]); } return ret; }};FenwickTree bit;int main() { n=getint(); for(register int i=1;i<=n;i++) { s.insert(getint(),i); } for(register int i=0;i

转载于:https://www.cnblogs.com/skylee03/p/9925499.html

你可能感兴趣的文章
必 备 习 题 集 (一)
查看>>
第 三 十 四 天:二 阶 段 复 习(五)
查看>>
windows下批量部署简易脚本
查看>>
python爬虫入门—统计豆瓣电影评论词频
查看>>
mysql由于server-id相同而造成同步失败
查看>>
【LoadRunner技术讲座4】利用sitescope监测监控mysql
查看>>
IEnumerable中运用yield
查看>>
python 时间转换(day,hous,minute,second)
查看>>
网络布线线材用量计算公式
查看>>
查询当前数据库用户会话信息
查看>>
创建触发器的基本语法
查看>>
2015.1.15 利用Oracle函数返回表结果 重大技术进步!
查看>>
2015.3.2 VC++6制作非MFC dll以及VS2005、VS2010调用
查看>>
转:模态对话框的支持 (IE,Firefox,Chrome)
查看>>
让您的电脑在任意目录可以支持图片的粘贴,试试看呗~
查看>>
Jenkins+QTP自动化测试框架
查看>>
文件下载
查看>>
《Node.js In Action》笔记之流程控制
查看>>
C++类和对象
查看>>
3518EV200 SDK学习1
查看>>