cdq分治,dp(i)表示以i为结尾的最长LIS,那么dp的递推是依赖于左边的。

因此在分治的时候需要利用左边的子问题来递推右边。

(345ms? 区间树TLE

/*********************************************************
* ------------------ *
* author AbyssFish *
**********************************************************/
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<queue>
#include<vector>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
#include<cmath>
#include<numeric>
using namespace std; const int MAX_N = +; int dp[MAX_N];
int x[MAX_N], y[MAX_N];
int ys[MAX_N];
int id[MAX_N];
int N; int ns; int *cur;
bool cmp(int a,int b)
{
return cur[a] < cur[b] || (cur[a] == cur[b] && a > b);//这是为了保证严格的单调性
} int compress(int *r, int *dat, int *a, int n)
{
for(int i = ; i < n; i++){
r[i] = i;
}
cur = dat;
sort(r,r+n,cmp);
a[r[]] = ;
for(int i = ; i < n; i++){
int k = r[i], p = r[i-];
a[k] = dat[k] == dat[p]?a[p]:a[p]+;
}
return a[r[n-]];
} int C[MAX_N]; void add(int yi,int d)
{
while(yi <= ns){
C[yi] = max(C[yi],d);
yi += yi&-yi;
}
} int mx_pfx(int yi)
{
int re = ;
while(yi > ){
re = max(C[yi],re);
yi &= yi-;
}
return re;
} void clr(int yi)
{
while(yi <= ns){
C[yi] = ;
yi += yi&-yi;
}
} void dv(int l, int r)
{
if(r-l <= ){
dp[l]++;
}
else {
int md = (l+r)>>;
dv(l,md); for(int i = l; i < r; i++) id[i] = i;
sort(id+l,id+r,cmp); //x维度 for(int i = l; i < r; i++){
int k = id[i];
if(k < md){ //position 维度
add(ys[k],dp[k]); //BIT下标是 y维度
}
else {
//查询位置前保证了BIT里的元素, 位置md之前,x严格小于待查元素
dp[k] = max(dp[k], mx_pfx(ys[k]-));//y严格小于待查元素的最大dp值
}
} for(int i = l; i < r; i++){
if(id[i] < md)
clr(ys[id[i]]);
}
dv(md,r);
}
} void solve()
{
scanf("%d",&N);
for(int i = ; i < N; i++){
scanf("%d%d",x+i,y+i);
}
ns = compress(id,y,ys,N);
cur = x;
dv(,N);
printf("%d\n",*max_element(dp,dp+N));
} //#define LOCAL
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif
solve();
return ;
}

SPOJ - LIS2 Another Longest Increasing Subsequence Problem的更多相关文章

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

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

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

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

  3. [BZOJ2225][SPOJ2371]LIS2 - Another Longest Increasing Subsequence Problem:CDQ分治+树状数组+DP

    分析 这回试了一下三级标题,不知道效果怎么样? 回到正题,二维最长上升子序列......嗯,我会树套树. 考虑\(CDQ\)分治,算法流程: 先递归进入左子区间. 将左,右子区间按\(x\)排序. 归 ...

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

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

  5. 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 ...

  6. [LintCode] Longest Increasing Subsequence 最长递增子序列

    Given a sequence of integers, find the longest increasing subsequence (LIS). You code should return ...

  7. 【Lintcode】076.Longest Increasing Subsequence

    题目: Given a sequence of integers, find the longest increasing subsequence (LIS). You code should ret ...

  8. LintCode刷题笔记--Longest Increasing Subsequence

    标签: 动态规划 描述: Given a sequence of integers, find the longest increasing subsequence (LIS). You code s ...

  9. [LeetCode] Longest Increasing Subsequence

    Longest Increasing Subsequence Given an unsorted array of integers, find the length of longest incre ...

随机推荐

  1. django 视图view

    视图里一般是函数和类,需要返回响应. 试图分为2种:2. CBV(class base view) FBV(function base view) from django.views import V ...

  2. 提取SQL中用到的表

    dos2unix * for i in `ls` do :}` awk '{print tolower($0)}' "${i}"|grep -Eiw "from" ...

  3. python 自动安装工具 setuptools(easy_install) 的使用

    1.下载安装 python 安装工具,下载地址:http://pypi.python.org/pypi/setuptools ,可以找到正确的版本进行下载. 2.解压缩后双击 ez_setup.py ...

  4. Host 'XXX' is not allowed to connect to this MySQL server解决方案

    如何允许远程连接mysql数据库呢,操作如下: 首先登录账号 mysql -uroot -p 使用mysql用户 use mysql 如果报此类错:ERROR 1820 (HY000): You mu ...

  5. LeetCode 454.四数相加 II(C++)

    给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0. 为了使问题简单化,所有的 A ...

  6. MATLAB基本概念和变量

    基本概念 1.x=int8(129)=>x=127     (带符号8位整数,最大值为127) x=uint8(129)=>x=129  (无符号型,最大值为255) 2.class函数得 ...

  7. Android多线程源码学习笔记一:handler、looper、message、messageQueue

    最近在学习Android多线程相关知识的源码,现在把自己的笔记整理一下,写出来加深印象. Android多线程通讯的核心是handler.looper.message.messageQueue,这篇文 ...

  8. 转载【Ubuntu】Ubuntu14.04虚拟机调整窗口大小自适应VMware14窗口

    Ubuntu屏幕居中一小块,很不好看 查看-–> 自动调整大小—>自动适应客户机/自动适应窗口 切一下就可以把Ubuntu图的界面大小调的和VMware窗口自适应了 效果:   转载 自h ...

  9. sqlserverToXML

    --raw模式 以属性的形式展示select * from goods for xml rawselect *from goods for xml raw('goods') --修改节点名称selec ...

  10. Mysql显示行号

    SELECT `Name`,(@rowNum:=@rowNum+1) AS rowNo FROM bas_student,(SELECT (@rowNum :=0)) a LIMIT 10;