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

Description

       给定N个数对(xi, yi),求最长上升子序列的长度。上升序列定义为{(xi, yi)}满足对i<j有xi<xj且yi<yj。

Input

Output

Sample Input

8
1 3
3 2
1 1
4 5
6 3
9 9
8 7
7 6

Sample Output

3

HINT

数据范围100000


有点烦的一道题。

有DP方程F[i]=F[j]+1(j<i&&x[j]<x[i]&&y[j]<y[i])

处理方法:先处理左边的F值,再处理左边的F转移到右边的F的情况,然后处理右边的F值。

递归完左边是这样一种情形,左边按x排序,右边无序(还没递归到)。

于是先把右边按x排序,然后维护一个指针在左边移动,每次在树状数组里更新f的最大值。

然后递归右边之后把两边的按x归并上去。

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 100050
int xx[N],yy[N],f[N],ans,t[N],T[N],n,V[N],cnt,tmp[N];
void fix(int x,int v) {for(;x<=n;x+=x&(-x)) T[x]=max(T[x],v);}
int inq(int x) {int re=0;for(;x;x-=x&(-x)) re=max(re,T[x]); return re;}
void clear(int x) {for(;x<=n;x+=x&(-x)) T[x]=0;}
bool cmp(int x,int y) {return xx[x]<xx[y];}
void solve(int l,int r) {
if(l==r) {
f[l]=max(f[l],1);
return ;
}
int mid=(l+r)>>1;
int i=l,j=l,k=mid+1;
solve(l,mid);
for(i=mid+1;i<=r;i++) {
tmp[i]=t[i];
}
sort(tmp+mid+1,tmp+r+1,cmp);
for(i=mid+1;i<=r;i++) {
while(j<=mid&&xx[t[j]]<xx[tmp[i]]) fix(yy[t[j]],f[t[j]]),j++;
f[tmp[i]]=max(f[tmp[i]],inq(yy[tmp[i]]-1)+1);
}
for(i=l;i<j;i++) clear(yy[t[i]]);
solve(mid+1,r);
i=l,j=l,k=mid+1;
while(j<=mid&&k<=r) {
if(xx[t[j]]<xx[t[k]]) tmp[i++]=t[j++];
else tmp[i++]=t[k++];
}
while(j<=mid) tmp[i++]=t[j++];
while(k<=r) tmp[i++]=t[k++];
for(i=l;i<=r;i++) t[i]=tmp[i];
}
int main() {
scanf("%d",&n);
int i;
for(i=1;i<=n;i++) scanf("%d%d",&xx[i],&yy[i]),t[i]=i,V[i]=yy[i];
sort(V+1,V+n+1);
cnt=unique(V+1,V+n+1)-V-1;
for(i=1;i<=n;i++) yy[i]=lower_bound(V+1,V+cnt+1,yy[i])-V;
// sort(t+1,t+n+1,cmp);
solve(1,n);
for(i=1;i<=n;i++) ans=max(ans,f[i]);
printf("%d\n",ans);
}

BZOJ_2225_[Spoj 2371]Another Longest Increasing_CDQ 分治+树状数组的更多相关文章

  1. 【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 ...

  2. BZOJ_3262_陌上花开_CDQ分治+树状数组

    BZOJ_3262_陌上花开_CDQ分治+树状数组 Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),用三个整数表示. 现在要对每朵花评级,一朵花的级别是它拥有的 ...

  3. 【BZOJ4553】[Tjoi2016&Heoi2016]序列 cdq分治+树状数组

    [BZOJ4553][Tjoi2016&Heoi2016]序列 Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能 ...

  4. BZOJ 1176 Mokia CDQ分治+树状数组

    1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 1854  Solved: 821[Submit][St ...

  5. 【bzoj3262】陌上花开 CDQ分治+树状数组

    题目描述 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当且仅当Sa&g ...

  6. BZOJ_2253_[2010 Beijing wc]纸箱堆叠 _CDQ分治+树状数组

    BZOJ_2253_[2010 Beijing wc]纸箱堆叠 _CDQ分治+树状数组 Description P 工厂是一个生产纸箱的工厂.纸箱生产线在人工输入三个参数 n p a , , 之后, ...

  7. BZOJ_3295_[Cqoi2011]动态逆序对_CDQ分治+树状数组

    BZOJ_3295_[Cqoi2011]动态逆序对_CDQ分治+树状数组 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一 ...

  8. BZOJ_2683_简单题&&BZOJ_1176_[Balkan2007]Mokia_CDQ分治+树状数组

    BZOJ_2683_简单题&&BZOJ_1176_[Balkan2007]Mokia_CDQ分治+树状数组 Description 维护一个W*W的矩阵,初始值均为S.每次操作可以增加 ...

  9. BZOJ 2683 简单题 cdq分治+树状数组

    题意:链接 **方法:**cdq分治+树状数组 解析: 首先对于这道题,看了范围之后.二维的数据结构是显然不能过的.于是我们可能会考虑把一维排序之后还有一位上数据结构什么的,然而cdq分治却可以非常好 ...

随机推荐

  1. R 包安装、载入和卸载

    生物上的一些包可以这样安装 source("https://bioconductor.org/biocLite.R") biocLite("affy") 一般的 ...

  2. 【Java TCP/IP Socket】Java NIO Socket VS 标准IO Socket

    简介 Java  NIO从JDK1.4引入,它提供了与标准IO完全不同的工作方式. NIO包(java.nio.*)引入了四个关键的抽象数据类型,它们共同解决传统的I/O类中的一些问题.    1. ...

  3. Spring拦截器从Request中获取Json格式的数据

    7 package com.newpp.core.interceptor; 8 9 import java.io.BufferedReader; 10 import java.io.ByteArray ...

  4. 【kotlin】基本语法when的使用,类似于java中的switch,但是又青出于蓝而胜于蓝

    when(要判断的参数){ 参数值为1 ->做这种事情 参数值为2 ->做另一种事情 else -> 类似于switch中的default } 扩展使用:https://www.cn ...

  5. 自动化运维工具Fabric - 密码管理(env.password and ssh key)

    在使用 Fabric 的过程中,如果大批量服务器处理的话,我们就需要针对配置主机的密码,每台主机的密码相同还好,不同的话,就需要针对不同的主机做配置了,以下有两种配置方式 注:本文主要参考官方文档 P ...

  6. Lambda 表达式的演示样例-来源(MSDN)

    本文演示怎样在你的程序中使用 lambda 表达式. 有关 lambda 表达式的概述.请參阅 C++ 中的 Lambda 表达式. 有关 lambda 表达式结构的具体信息,请參阅 Lambda 表 ...

  7. 生活娱乐 360安全卫士和QQ大战

    360安全卫士指控QQ侵犯用户隐私 [提要]9月26日晚上11点16分,安全软件商360在他们的论坛中发布了最新公告:<360安全卫士发布隐私保护器 专门曝光"窥私"软件&g ...

  8. SolidEdge 如何由装配图快速进行标注和零件序号编写 制作BOM表

    点击"零件明细表",然后点击要生成序号的视图,然后点击前面两项(自动标号和放置清单),点击完成后效果如下图所示.   在点击完成之前,先点击他前面的一个按钮,取消勾选"项 ...

  9. CCPhysicsSprite

    #ifndef __PHYSICSNODES_CCPHYSICSSPRITE_H__ #define __PHYSICSNODES_CCPHYSICSSPRITE_H__ #include " ...

  10. IOS7 开发注意事项

    1,修改状态栏的样式和隐藏. 首先,需要在Info.plist配置文件中,增加键:UIViewControllerBasedStatusBarAppearance,并设置为YES: 然后,在UIVie ...