SPOJ - LIS2 Another Longest Increasing Subsequence Problem
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的更多相关文章
- SPOJ LIS2 Another Longest Increasing Subsequence Problem 三维偏序最长链 CDQ分治
Another Longest Increasing Subsequence Problem Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://a ...
- SPOJ LIS2 - Another Longest Increasing Subsequence Problem(CDQ分治优化DP)
题目链接 LIS2 经典的三维偏序问题. 考虑$cdq$分治. 不过这题的顺序应该是 $cdq(l, mid)$ $solve(l, r)$ $cdq(mid+1, r)$ 因为有个$DP$. #i ...
- [BZOJ2225][SPOJ2371]LIS2 - Another Longest Increasing Subsequence Problem:CDQ分治+树状数组+DP
分析 这回试了一下三级标题,不知道效果怎么样? 回到正题,二维最长上升子序列......嗯,我会树套树. 考虑\(CDQ\)分治,算法流程: 先递归进入左子区间. 将左,右子区间按\(x\)排序. 归 ...
- SPOJ Another Longest Increasing Subsequence Problem 三维最长链
SPOJ Another Longest Increasing Subsequence Problem 传送门:https://www.spoj.com/problems/LIS2/en/ 题意: 给 ...
- 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 ...
- [LintCode] Longest Increasing Subsequence 最长递增子序列
Given a sequence of integers, find the longest increasing subsequence (LIS). You code should return ...
- 【Lintcode】076.Longest Increasing Subsequence
题目: Given a sequence of integers, find the longest increasing subsequence (LIS). You code should ret ...
- LintCode刷题笔记--Longest Increasing Subsequence
标签: 动态规划 描述: Given a sequence of integers, find the longest increasing subsequence (LIS). You code s ...
- [LeetCode] Longest Increasing Subsequence
Longest Increasing Subsequence Given an unsorted array of integers, find the length of longest incre ...
随机推荐
- 如何查看mysql执行的所有SQL
在程序调试中,有时需要看到最终在DB执行的SQL文,而默认mysql此功能是关闭的,开启的方法如下: set global general_log='ON'; 然后用如下命令查看log文件所在路径即可 ...
- 微软原版SQL Helper
代码 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-- ...
- SqlServer自动备份作业
/*********完整备份作业*********/ –完整备份,每周一次 USE Master GO declare @str varchar(100) set @str='D:\DBtext\jg ...
- JS之scrollTop、offsetHeight和offsetTop等属性用法详解和拖拽div
标题中的几个相关相关属性在网页中有这大量的应用,尤其是在运动框架中,但是由于有些属性相互之间的概念比较混杂或者浏览器兼容性问题,导致掌握起来比较有难度,下面就介绍一下相关属性的用法.先来看一张比较经典 ...
- apache 与php的安装
1 系统环境与软件 1 php5.5.6 下载链接:http://windows.php.net/download/#php-5.5 推荐 V11 x64,也就是64bit的. 2 apache2 ...
- java——编译和运行
Java源代码---->编译器---->Java字节码(即虚拟指令..class文件.特殊的二进制文件.二进制字节码文件)---->jvm---->解释器(jvm的一部分)-- ...
- [转]javascript实现限制上传文件的大小
本文转自:http://www.micmiu.com/lang/javascript/js-check-filesize/ 目录 基本思路 示例 [一].基本思路 在FireFox.Chrome浏览器 ...
- 在线编辑word文档 可保存到服务器
使用说明:该方法只在office xp 和 2003上 测试通过,2000及以下 版本没试. 注意:你要打开的服务器端的word文档要有写权限.iis要开起 web服务扩展中的webdav为允许 具体 ...
- ETL模型设计
传统的关系数据库一般采用二维数表的形式来表示数据,一个维是行,另一个维是列,行和列的交叉处就是数据元素.关系数据的基础是关系数据库模型,通过标准的SQL语言来加以实现. 数据仓库是多维数据库,它扩展了 ...
- httpd.conf 配置
# # This is the main Apache server configuration file. It contains the # configuration directives th ...