题目大意:求二维最长上升子序列的长度。

题解:

可以看出,这个问题等价于三维偏序问题。

不过在进行分治的时候要注意,由于 dp 转移是有顺序的,因此只能先处理左半部分,再处理左半部分对右边的贡献,最后处理右半部分。

代码如下

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10; int n,ans,d[maxn],tot,dp[maxn];
struct node{int x,y,id;}p[maxn],tmp[maxn];
int bit[maxn];
void modify(int pos,int val){
for(int i=pos;i<=tot;i+=i&-i)bit[i]=max(bit[i],val);
}
int query(int pos){
int ret=0;
for(int i=pos;i;i-=i&-i)ret=max(ret,bit[i]);
return ret;
}
void clear(int pos){
for(int i=pos;i<=tot;i+=i&-i)bit[i]=0;
} void cdq(int l,int r){
if(l==r)return;
int mid=l+r>>1;
cdq(l,mid);
sort(p+l,p+mid+1,[](const node &a,const node &b){return a.x<b.x;});
sort(p+mid+1,p+r+1,[](const node &a,const node &b){return a.x<b.x;});
for(int x=l,y=mid+1;y<=r;y++){
while(x<=mid&&p[x].x<p[y].x)modify(p[x].y,dp[p[x].id]),++x;
dp[p[y].id]=max(dp[p[y].id],query(p[y].y-1)+1);
}
for(int i=l;i<=mid;i++)clear(p[i].y);
sort(p+mid+1,p+r+1,[](const node &a,const node &b){return a.id<b.id;});
cdq(mid+1,r);
}
void read_and_parse(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d",&p[i].x,&p[i].y);
p[i].id=i,d[++tot]=p[i].y;
}
sort(d+1,d+tot+1);
tot=unique(d+1,d+tot+1)-d-1;
for(int i=1;i<=n;i++)p[i].y=lower_bound(d+1,d+tot+1,p[i].y)-d;
}
void solve(){
for(int i=1;i<=n;i++)dp[i]=1;
cdq(1,n);
for(int i=1;i<=n;i++)ans=max(ans,dp[i]);
printf("%d\n",ans);
}
int main(){
read_and_parse();
solve();
return 0;
}

【SPOJ2371】LIS2的更多相关文章

  1. 【前端】:Dom

    前言: 昨天写了篇关于JavaScript的,今天写篇Dom的(插入4个实例),写完之后感觉知识点还不少~ 内容当然会用到[前端]:JavaScript的知识.下篇博客会写关于jQuery~~ 一.D ...

  2. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  3. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  4. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  5. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  6. 【调侃】IOC前世今生

    前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...

  7. Python高手之路【三】python基础之函数

    基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...

  8. Python高手之路【一】初识python

    Python简介 1:Python的创始人 Python (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种解释型.面向对象.动态数据类型的高级程序设计语言,由荷兰人Guido ...

  9. 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】

    说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...

随机推荐

  1. java程序 避免重复启动的方法

    http://www.cppblog.com/biao/archive/2010/12/23/137254.html package swingtest; import java.io.File; i ...

  2. Smarty快速入门

    1.Smarty是用纯php语言写的类 2.功能是实现前后端分离 3.Smarty简洁高效 4.快速入门案例 1.下载 smarty源码 https://www.smarty.net/ 2.搭建PHP ...

  3. C学习笔记-内存管理

    作用域 一个C语言变量的作用域可以是代码块 作用域,函数作用域或者文件作用域 代码块是{}之间的一段代码 同一个代码块不可以有重名变量 auto自动变量 一般情况下代码块内部定义的变量都是自动变量 也 ...

  4. 记录Linq中lambda动态表达式的使用方式

    项目中有的时候我们会用到动态表达式的方式去查询数据,这里简单记录下个人的使用方式,方便使用↓ //构建参数表达式 ParameterExpression parameter = Expression. ...

  5. mac sudo异常

    dsenableroot -d -u <your_admin_username> -p <your_password>  

  6. flink部署

    参考: https://ververica.cn/developers-resources/ #flink参数 https://blog.csdn.net/qq_35440040/article/de ...

  7. [转帖]ORA-00600: internal error code, arguments: [4193]问题解决

    ORA-00600: internal error code, arguments: [4193]问题解决 https://www.cnblogs.com/linyfeng/p/7496736.htm ...

  8. oracle查询表的结构

    SELECT t.table_name,t.column_name,t.data_type||'('||t.data_length||')', t1.comments FROM User_Tab_Co ...

  9. shell提升篇

    6. 条件判断 1.基本语法 [ condition ](注意condition前后要有空格) 注意:条件非空即为true,[ fsdm ]返回true,[] 返回false. 2. 常用判断条件 ( ...

  10. springboot 用redis缓存整合spring cache注解,使用Json序列化和反序列化。

    springboot下用cache注解整合redis并使用json序列化反序列化. cache注解整合redis 最近发现spring的注解用起来真的是很方便.随即产生了能不能吧spring注解使用r ...