分析

这回试了一下三级标题,不知道效果怎么样?

回到正题,二维最长上升子序列......嗯,我会树套树。

考虑\(CDQ\)分治,算法流程:

  1. 先递归进入左子区间。

  2. 将左,右子区间按\(x\)排序。

  3. 归并处理左右子区间,在过程中使用树状数组加速\(DP\)。

  4. 还原右区间,清空树状数组。

  5. 递归进入右子区间。

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cctype>
#include <algorithm>
#define lowbit(x) ((x)&(-(x)))
#define rin(i,a,b) for(int i=(a);i<=(b);i++)
#define rec(i,a,b) for(int i=(a);i>=(b);i--)
#define trav(i,a) for(int i=head[(a)];i;i=e[i].nxt)
using std::cin;
using std::cout;
using std::endl;
typedef long long LL; inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
} const int MAXN=100005;
int n,b[MAXN];
int siz;
int bit[MAXN];
struct Node{
int x,y,pos,f;
Node(){
f=1;
}
friend bool operator < (Node x,Node y){
return x.x==y.x?x.y<y.y:x.x<y.x;
}
}a[MAXN],c[MAXN]; inline void Add(int x,int kk){
for(int i=x;i<=siz;i+=lowbit(i)) bit[i]=(kk==-1?0:std::max(bit[i],kk));
} inline int Ask(int x){
int ret=0;
for(int i=x;i;i-=lowbit(i)) ret=std::max(ret,bit[i]);
return ret;
} inline bool cmp(Node x,Node y){
return x.pos<y.pos;
} void cdq(int l,int r){
if(l>=r) return;
int mid=((l+r)>>1);
cdq(l,mid);
std::sort(a+l,a+mid+1);
std::sort(a+mid+1,a+r+1);
int lptr=l;
rin(rptr,mid+1,r){
while(lptr<=mid&&a[lptr].x<a[rptr].x){
Add(a[lptr].y,a[lptr].f);
lptr++;
}
a[rptr].f=std::max(a[rptr].f,Ask(a[rptr].y-1)+1);
}
rin(i,l,lptr-1) Add(a[i].y,-1);
rin(i,mid+1,r) c[i]=a[i];
rin(i,mid+1,r) a[c[i].pos]=c[i];
// std::sort(a+mid+1,a+r+1,cmp);
cdq(mid+1,r);
} int main(){
n=read();
rin(i,1,n){
a[i].x=read();
b[i]=a[i].y=read();
a[i].pos=i;
}
std::sort(b+1,b+n+1);
siz=std::unique(b+1,b+n+1)-b-1;
rin(i,1,n) a[i].y=std::lower_bound(b+1,b+n+1,a[i].y)-b;
cdq(1,n);
int ans=1;
rin(i,1,n) ans=std::max(ans,a[i].f);
printf("%d\n",ans);
return 0;
}

[BZOJ2225][SPOJ2371]LIS2 - Another Longest Increasing Subsequence Problem:CDQ分治+树状数组+DP的更多相关文章

  1. SPOJ:Another Longest Increasing Subsequence Problem(CDQ分治求三维偏序)

    Given a sequence of N pairs of integers, find the length of the longest increasing subsequence of it ...

  2. SPOJ LIS2 Another Longest Increasing Subsequence Problem 三维偏序最长链 CDQ分治

    Another Longest Increasing Subsequence Problem Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://a ...

  3. SPOJ LIS2 - Another Longest Increasing Subsequence Problem(CDQ分治优化DP)

    题目链接  LIS2 经典的三维偏序问题. 考虑$cdq$分治. 不过这题的顺序应该是 $cdq(l, mid)$ $solve(l, r)$ $cdq(mid+1, r)$ 因为有个$DP$. #i ...

  4. SPOJ - LIS2 Another Longest Increasing Subsequence Problem

    cdq分治,dp(i)表示以i为结尾的最长LIS,那么dp的递推是依赖于左边的. 因此在分治的时候需要利用左边的子问题来递推右边. (345ms? 区间树TLE /****************** ...

  5. 【bzoj2225】[Spoj 2371]Another Longest Increasing CDQ分治+树状数组

    题目描述 给定N个数对(xi, yi),求最长上升子序列的长度.上升序列定义为{(xi, yi)}满足对i<j有xi<xj且yi<yj. 样例输入 8 1 3 3 2 1 1 4 5 ...

  6. HDU 5618:Jam's problem again(CDQ分治+树状数组处理三维偏序)

    http://acm.hdu.edu.cn/showproblem.php?pid=5618 题意:…… 思路:和NEUOJ那题一样的.重新写了遍理解了一下,算作处理三维偏序的模板了. #includ ...

  7. SPOJ Another Longest Increasing Subsequence Problem 三维最长链

    SPOJ Another Longest Increasing Subsequence Problem 传送门:https://www.spoj.com/problems/LIS2/en/ 题意: 给 ...

  8. BZOJ_2225_[Spoj 2371]Another Longest Increasing_CDQ 分治+树状数组

    BZOJ_2225_[Spoj 2371]Another Longest Increasing_CDQ 分治+树状数组 Description        给定N个数对(xi, yi),求最长上升子 ...

  9. hdu 3030 Increasing Speed Limits (离散化+树状数组+DP思想)

    Increasing Speed Limits Time Limit: 2000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java ...

随机推荐

  1. 深入理解java:2.3.2. 并发编程concurrent包 之重入锁/读写锁/条件锁

    重入锁 Java中的重入锁(即ReentrantLock)   与JVM内置锁(即synchronized)一样,是一种排它锁. ReentrantLock提供了多样化的同步,比如有时间限制的同步(定 ...

  2. CAS单点登录系统入门--分布式登录验证

    1.开源单点登录系统CAS入门 1.1 什么是单点登录 单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要 ...

  3. [BZOJ 2006] [NOI 2010]超级钢琴(贪心+ST表+堆)

    [BZOJ 2006] [NOI 2010]超级钢琴(贪心+ST表+堆) 题面 给出一个长度为n的序列,选k段长度在L到R之间的区间,一个区间的值等于区间内所有元素之的和,使得k个区间的值之和最大.区 ...

  4. redis进阶知识

    原文地址:https://my.oschina.net/u/4052893/blog/3001173 一.缓存雪崩 1.1什么是缓存雪崩? 回顾一下我们为什么要用缓存(Redis): 现在有个问题,如 ...

  5. springboot 配置

    springboot 配置文件中属性变量引用方式@@解析 这种属性应用方式是field_name=@field_value@. 两个@符号是springboot为替代${}属性占位符产生,原因是${} ...

  6. P4290 [HAOI2008]玩具取名

    传送门 $dp$ 设 $f[i][j][k]$ 表示初始为 $k$ 时,能否得到 $[i,j]$ 这一段子串 设 $pd[i][j][k]$ 表示长度为二的字符串 $ij$ 能否由 $k$ 得到 然后 ...

  7. Structs2下的MyFirstTest

    1.这是<Struts2-权威指南>第二章的例子 2.博文主要说明在eclipse下如何创建一个struts2项目 3.实现功能:在login.jsp输入用户名和密码,若用户名为scott ...

  8. Chrome浏览器记住密码后input框黄色背景且背景图片不显示的问题

    Chrome浏览器记住密码后再进入登录页后,输入框背景颜色变为黄色,字体颜色变成#000黑色,且添加的背景图片也那不显示了,进入审查元素后,发现浏览器默认给输入框添加了样式,并且无法通过importa ...

  9. Springboot+CAS单点登录

    一:安装CAS 下载cas:https://github.com/apereo/cas 1.1 将cas并打成war包.放入一个干净的tomcat中,启动tomcat测试: http://localh ...

  10. k3 cloud凭证过账的时候提示凭证号不连续

    解决办法:进入凭证查询页面,点击凭证业务操作下面的凭证整理 提交整理完成即可