题目链接:hdu_5324_Boring Class

题意:

给出n个二维点对,求LIS长度和编号字典序最小的LIS(x非增,y非减)

题解:

dp[i]=max(dp[j]) (i>j,l[i]>=l[j],r[i]<=r[i])

一看就是三维偏序问题。

如果树套树写的好,空间开的大的话,一样可以过,不过这里还是用cdq分治套树状数组好写一点。

用lowbit来维护dp[j]的最大值,然后因为要字典序最小,所以从后往前dp。

 #include<bits/stdc++.h>
#define F(i,a,b) for(int i=a;i<=b;i++)
using namespace std; const int N=1e5+; int n,dp[N],hsh[N],ed,pre[N]; struct BIT
{
int val,idx;
BIT(){val=,idx=N;}
}bit[N],tp; inline void up(BIT &a,BIT b){if(a.val<b.val||a.val==b.val&&a.idx>b.idx)a=b;}
inline void add(int x,BIT c){while(x<=n)up(bit[x],c),x+=x&-x;}
inline void clr(int x){while(x<=n)bit[x].val=,bit[x].idx=N,x+=x&-x;}
inline BIT ask(int x){BIT ans;while(x)up(ans,bit[x]),x-=x&-x;return ans;} struct node
{
int x,y,idx;
bool operator<(const node & b)const
{
if(y!=b.y)return y<b.y;
if(x!=b.x)return x>b.x;
return idx<b.idx;
}
}a[N],tmp[N]; void cdq(int l,int r)
{
if(l==r)return;
int m=l+r>>;
cdq(m+,r);
F(i,l,r)tmp[i]=a[i];
sort(tmp+l,tmp+m+);
sort(tmp+m+,tmp+r+);
int j=r;
for(int i=m;i>=l;i--)
{
for(;j>m&&tmp[j].y>=tmp[i].y;j--)
{
tp.val=dp[tmp[j].idx],tp.idx=tmp[j].idx;
add(tmp[j].x,tp);
}
BIT an=ask(tmp[i].x);
if(dp[tmp[i].idx]<an.val+)dp[tmp[i].idx]=an.val+,pre[tmp[i].idx]=an.idx;
else if(dp[tmp[i].idx]==an.val+)pre[tmp[i].idx]=min(pre[tmp[i].idx],an.idx);
}
F(i,m+,r)clr(tmp[i].x);
cdq(l,m);
} int main()
{
while(~scanf("%d",&n))
{
F(i,,n)scanf("%d",&a[i].x),a[i].idx=i,dp[i]=,pre[i]=N;
F(i,,n)scanf("%d",&a[i].y);
F(i,,n)hsh[i]=a[i].x;
sort(hsh+,hsh++n),ed=unique(hsh+,hsh++n)-hsh;
F(i,,n)a[i].x=lower_bound(hsh+,hsh++ed,a[i].x)-hsh;
F(i,,n)hsh[i]=a[i].y;
sort(hsh+,hsh++n),ed=unique(hsh+,hsh++n)-hsh;
F(i,,n)a[i].y=lower_bound(hsh+,hsh++ed,a[i].y)-hsh;
cdq(,n);
int mx=,st;
F(i,,n)mx=max(mx,dp[i]);
F(i,,n)if(mx==dp[i]){st=i;break;}
printf("%d\n",mx);
for(int i=st,cnt=;i<=n;i=pre[i])printf("%d%c",i," \n"[++cnt==mx]);
}
return ;
}

hdu_5324_Boring Class(cdq分治+树状数组)的更多相关文章

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

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

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

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

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

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

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

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

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

  6. LOJ3146 APIO2019路灯(cdq分治+树状数组)

    每个时刻都形成若干段满足段内任意两点可达.将其视为若干正方形.则查询相当于求历史上某点被正方形包含的时刻数量.并且注意到每个时刻只有O(1)个正方形出现或消失,那么求出每个矩形的出现时间和消失时间,就 ...

  7. BZOJ 4553 [Tjoi2016&Heoi2016]序列 ——CDQ分治 树状数组

    考虑答案的构成,发现是一个有限制条件的偏序问题. 然后三个维度的DP,可以排序.CDQ.树状数组各解决一维. #include <map> #include <cmath> # ...

  8. BZOJ1176---[Balkan2007]Mokia (CDQ分治 + 树状数组)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1176 CDQ第一题,warush了好久.. CDQ分治推荐论文: 1 <从<C ...

  9. Hdu4742-Pinball Game 3D(cdq分治+树状数组)

    Problem Description RD is a smart boy and excel in pinball game. However, playing common 2D pinball ...

随机推荐

  1. (89C51)定时器计时1s

    unsigned ; void initT1() { EA=; TH1=0xDC; TL1=0X00; TMOD=0x10; TR1=; ET1=; } { TH1=0xDC; TL1=0X00; c ...

  2. CentOS7安装和配置Nginx(https)

    安装Nginx下载安装包# wget http://nginx.org/download/nginx-1.11.7.tar.gz# tar -zxvf nginx-1.11.7.tar.gz# cd ...

  3. 有哪些可以将网页另存图片的chrome插件?功能类似网页截图

    说实话chrome插件哪些,想找出最好最强的还真不容易,各有千秋.今天就概括性介绍下一些网页打印,图片另存为等常见需求的chrome插件.1.Awesome ScreenshotAwesome scr ...

  4. ViewController

    ViewController ViewController 进入VC后先调用loadView,再调用ViewDidLoad ViewDidLoad皆为系统调用 需要先调用[super viewDidL ...

  5. .net c#通过Exif获取图片信息(参数)

    简介 想要获取图片的信息,例如快门速度.ISO值等等,我们可以通过读取Exif中存储的信息.Exif(Exchangeable Image File)是存储在JPEG格式照片头部的一段信息,相机和手机 ...

  6. WPF Application

    Application类作为启动的入口,在VS中,通常自动代码为我们继承了Application类,这样做的有点,我还没有理解到,但是我们先学到这个知识点. 为了能够更好的控制整个启动过程,包括得到A ...

  7. 自动生成 Makefile (automake/autoconf 入门)

    作为Linux 下的程序开发人员,大家一定都遇到过Makefile ,用make 命令来编译自己写的程序确实是很方便.一般情况下,大家都是手工写一个简单Makefile ,如果要想写出一个符合自由软件 ...

  8. 【NOIP2011提高组】选择客栈

    题目不附了,是一个单纯的ST模型,但是考验各种常数优化. 最大的优化是对于同颜色的客栈来说,如果1号和2号成功配对了,那么1和3,1和4都可以成功配对,那么只要找到一对成功配对的,我们就直接加上剩下的 ...

  9. xaml中的依赖属性

    wpf使用依赖属性完成数据绑定.动画.属性变更通知.样式化等.对于数据绑定.绑定到.NET属性源上的UI元素的属性必须是依赖属性 .net的一般属性定义如下 private int val;      ...

  10. 2、表单form

    只要使用input,就用form,使用方法是在所有的input之外加一个总的form双标签 切记给每个input都加name,提交表单时同时会提交name属性 input可以做的事:文本框.密码框.单 ...