二维LIS(CDQ分治)
题目描述
给定一个长度为N的序列S,S的每个元素pi是一个二元组(xi,yi),定义pi<pj当且仅当xi<xj并且yi<yj,求S的最长上升子序列长度
输入格式
第一行一个N,表示一共有N个元素
接下来有N行,每行包含两个正整数xi,yi
输出格式
输出一行一个整数,代表序列S的最长上升子序列的长度
一道很好的模板题,比较入门吧
CDQ分治+线段树/树状数组维护最大值就好了
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct nasm{
int x,y,z;
}a[];
int f[];
int tr[];
int tmp[];
int n;
bool cmp(nasm g,nasm u)
{
return g.y<u.y;
}
bool cmq(nasm g,nasm u)
{
return g.x<u.x;
}
void updt(int pi,int v,int l,int r,int spc)
{
if(l==r)
{
tr[spc]=v==?v:max(v,tr[spc]);
return ;
}
int m=(l+r)>>;
if(pi<=m)
updt(pi,v,l,m,spc<<);
else
updt(pi,v,m+,r,spc<<|);
tr[spc]=max(tr[spc<<],tr[spc<<|]);
}
int ask(int ll,int rr,int l,int r,int spc)
{
if(ll>rr)return ;
if(l>=ll&&r<=rr)return tr[spc];
int m=(l+r)>>;
if(m>=rr)return ask(ll,rr,l,m,spc<<);
if(m<ll)return ask(ll,rr,m+,r,spc<<|);
return max(ask(ll,rr,l,m,spc<<),ask(ll,rr,m+,r,spc<<|));
}
void wrk(int l,int r)
{
int mid=(l+r)>>;
sort(a+l,a+mid+,cmp);
sort(a+mid+,a+r+,cmp);
for(int i=l,j=mid+;j<=r;j++)
{
for(;a[i].y<a[j].y&&i<=mid;i++)
updt(a[i].z,f[a[i].x],,n,);
f[a[j].x]=max(f[a[j].x],ask(,a[j].z-,,n,)+);
}
for(int i=l;i<=mid;i++)updt(a[i].z,,,n,);
sort(a+mid+,a+r+,cmq);
}
void cdq(int l,int r)
{
if(l==r)
return ;
int mid=(l+r)>>;
cdq(l,mid);
wrk(l,r);
cdq(mid+,r); }
int erf(int l,int r,int aim)
{
if(l==r)return l;
int m=(l+r)>>;
if(aim<=tmp[m])
return erf(l,m,aim);
return erf(m+,r,aim);
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d%d",&a[i].y,&a[i].z);
f[i]=;
a[i].x=i;
tmp[i]=a[i].z;
}
sort(tmp+,tmp+n+);
for(int i=;i<=n;i++)
a[i].z=erf(,n,a[i].z);
cdq(,n);
int ans=;
for(int i=;i<=n;i++)
ans=max(ans,f[i]);
printf("%d\n",ans);
return ;
}
二维LIS
二维LIS(CDQ分治)的更多相关文章
- BZOJ2244: [SDOI2011]拦截导弹(CDQ分治,二维LIS,计数)
Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度.并且能够拦截任意速度的导弹,但是以后每一发炮弹都不能高 ...
- HDU 1160 FatMouse's Speed(要记录路径的二维LIS)
FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- 三维偏序-二维LIS
Another Longest Increasing Subsequence Problem 有两种思路. 思路一: 考虑到如果只有一维,那么可以用f[s]表示长度为s时,最后一个数是多少,把这个想法 ...
- HDU 1025 Constructing Roads In JGShining's Kingdom(二维LIS)
Constructing Roads In JGShining's Kingdom Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65 ...
- ACdream 1216——Beautiful People——————【二维LIS,nlogn处理】
Beautiful People Special Judge Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (J ...
- SGU 521 North-East ( 二维LIS 线段树优化 )
521. "North-East" Time limit per test: 0.5 second(s)Memory limit: 262144 kilobytes input: ...
- [偏序关系与CDQ分治]【学习笔记】
组合数学真是太棒了 $CDQ$真是太棒了(雾 参考资料: 1.<组合数学> 2.论文 课件 很容易查到 3.sro __stdcall 偏序关系 关系: 集合$X$上的关系是$X$与$X$ ...
- N维偏序:cdq分治
cdq(陈丹琦)分治,是一种类似二分的算法.基本思想同分治: 递归,把大问题划分成若干个结构相同的子问题,直到(L==R): 处理左区间[L,mid]对右区间[mid+1,R]的影响: 合并. 它可以 ...
- 『cdq分治和多维偏序问题』
更新了三维偏序问题的拓展 cdq分治 \(cdq\)分治是一种由\(IOI\ Au\)选手\(cdq\)提出的离线分治算法,又称基于时间的分治算法. 二维偏序问题 这是\(cdq\)分治最早提出的时候 ...
随机推荐
- CodeForces 570B Simple Game 概率
原题: http://codeforces.com/contest/570/problem/B 题目: Simple Game time limit per test1 second memory l ...
- vue.2.0-自定义全局组件
App.vue <template> <div id="app"> <h3>welcome vue-loading</h3> < ...
- POSTGRESQL NO TABLE
POSTGRESQL EXTENDING SQL GRIGGER PROCEDURAL
- SQL server 事务介绍,创建与使用
事务(Transaction)事务是一种机制,一个操作序列,包含一组操作指令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求(即要么全部执行,要么全部不执行)---------------- ...
- python3之开发环境PyCharm配置
1. 安装PyCharm(安装时注意选择python),地址: https://www.jetbrains.com/pycharm/ 2. 安装python 地址: https://www.pytho ...
- 【RHEL7/CentOS7基本配置】
目录 @ 相比于6.x的版本,Rhel7/CentOS7增加或改进了以下7大特性. 1.身份管理 kerberos的跨平台信任机制:kerberos将完全兼容微软活动目录,实现完全使用活动目录进行认证 ...
- scrapy框架中间件配置代理
scrapy框架中间件配置代理import random#代理池PROXY_http = [ '106.240.254.138:80', '211.24.102.168:80',]PROXY_http ...
- WPF 支持的多线程 UI 并不是线程安全的
原文:WPF 支持的多线程 UI 并不是线程安全的 版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可.欢迎转载.使用.重新发布,但务必保留文章署名吕毅(包含链 ...
- UVA 11642 Fire!
Fire! Time Limit: 1000ms Memory Limit: 131072KB This problem will be judged on UVA. Original ID: 116 ...
- js---11闭包
//匿名立即调用函数 (function(){//把a,b,f全部隐藏在函数中,外部访问不到, var a = 5; var b = 6; function f(){ alert(a); } wind ...