题目传送门

题目要求一个3维偏序点的最长子序列,并且字典序最小。

题解:

这种题目出现的次数特别多了。如果不需要保证字典序的话直接cdq就好了。

这里需要维护字典序的话,我们从后往前配对就好了,因为越前面的点权重越大。(对于字典序来说)

代码:

 #include<bits/stdc++.h>
using namespace std;
#define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
#define LL long long
#define ULL unsigned LL
#define fi first
#define se second
#define pb push_back
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define lch(x) tr[x].son[0]
#define rch(x) tr[x].son[1]
#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c))
typedef pair<int,int> pll;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const LL mod = (int)1e9+;
const int N = 1e5 + ;
int ans[N];
int pre[N];
struct Node{
int l, r, id;
bool operator<(const Node x) const{
if(r != x.r) return r > x.r;
return id > x.id;
}
}A[N], tmp[N];
int ll[N], lsz;
int tree[N][];
void add(int x, int len, int id){
for(int i = x; i < N; i+=i&(-i)){
if(len > tree[i][]){
tree[i][] = len;
tree[i][] = id;
}
else if(len == tree[i][]) tree[i][] = min(tree[i][], id);
}
}
pll query(int x){
int len = , ret = ;
for(int i = x; i > ; i -= i &(-i)){
if(len == tree[i][]) ret = min(ret, tree[i][]);
else if(len < tree[i][]){
len = tree[i][];
ret = tree[i][];
}
}
return pll(len, ret);
}
void clear(int x){
for(int i = x; i < N; i += i&(-i))
tree[i][] = tree[i][] = ;
}
void cdq(int l, int r){
if(l == r) return ;
int m = l+r >> ;
cdq(m+,r);
for(int i = l; i <= r; i++)
tmp[i] = A[i];
sort(tmp+l, tmp+r+);
for(int i = l; i <= r; i++){
//cout << tmp[i].id << " " << tmp[i].l << " " << tmp[i].r << endl;
int id = tmp[i].id;
if(id > m) add(tmp[i].l, ans[id], id);
else {
pll p = query(tmp[i].l);
int len = p.fi, iid = p.se;
if(len == ) continue;
if(len+ > ans[id]){
ans[id] = len+;
pre[id] = iid;
}
else if(len + == ans[id])
pre[id] = min(pre[id], iid);
}
}
for(int i = l; i <= r; i++){
if(tmp[i].id > m) clear(tmp[i].l);
}
cdq(l,m);
}
int main(){
int n;
lsz = ;
while(~scanf("%d", &n)){
for(int i = ; i <= n; i++){
ans[i] = , pre[i] = i;
A[i].id = i;
scanf("%d", &A[i].l);
ll[i] = A[i].l;
}
sort(ll+, ll++n);
lsz = unique(ll+,ll++n) - ll - ;
for(int i = ; i <= n; i++){
scanf("%d", &A[i].r);
A[i].l = lower_bound(ll+, ll++lsz, A[i].l) - ll;
}
cdq(,n);
int fans = , fid = ;
for(int i = ; i <= n; i++){
if(fans < ans[i]){
fans = ans[i];
fid = i;
}
}
printf("%d\n", fans);
for(int i = ; i <= fans; i++){
printf("%d%c", fid, " \n"[i==fans]);
fid = pre[fid];
} }
return ;
}

HDU 5324 Boring Class CDQ分治的更多相关文章

  1. hdu 3842 Machine Works(cdq分治维护凸壳)

    题目链接:hdu 3842 Machine Works 详细题解: HDU 3842 Machine Works cdq分治 斜率优化 细节比较多,好好体会一下. 在维护斜率的时候要考虑x1与x2是否 ...

  2. HDU 5324 Boring Class【cdq分治】

    这就是一个三维排序的问题,一维递减,两维递增,这样的问题用裸的CDQ分治恰好能够解决. 如同HDU 4742(三维排序,一个三维都是递增的) 由于最小字典序比較麻烦,所以要从后面往前面做分治.每一个点 ...

  3. 2015 Multi-University Training Contest 3 hdu 5324 Boring Class

    Boring Class Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  4. HDU 5730 Shell Necklace cdq分治+FFT

    题意:一段长为 i 的项链有 a[i] 种装饰方式,问长度为n的相连共有多少种装饰方式 分析:采用dp做法,dp[i]=∑dp[j]*a[i-j]+a[i],(1<=j<=i-1) 然后对 ...

  5. HDU 6183 Color it cdq分治 + 线段树 + 状态压缩

    Color it Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) Pro ...

  6. Boring Class HDU - 5324 (CDQ分治)

    Mr. Zstu and Mr. Hdu are taking a boring class , Mr. Zstu comes up with a problem to kill time, Mr. ...

  7. HDU - 5324:Boring Class (CDQ分治&树状数组&最小字典序)

    题意:给定N个组合,每个组合有a和b,现在求最长序列,满足a不升,b不降. 思路:三位偏序,CDQ分治.   但是没想到怎么输出最小字典序,我好菜啊. 最小字典序: 我们倒序CDQ分治,ans[i]表 ...

  8. HDU 3507 Print Article(CDQ分治+分治DP)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3507 [题目大意] 将长度为n的数列分段,最小化每段和的平方和. [题解] 根据题目很容易得到dp ...

  9. HDU 5730 Shell Necklace(CDQ分治+FFT)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5730 [题目大意] 给出一个数组w,表示不同长度的字段的权值,比如w[3]=5表示如果字段长度为3 ...

随机推荐

  1. 浅析java中的语法糖

    概述 编译器是一种计算机程序, 它主要的目的是将便于人编写.阅读.维护的高级计算机语言所写的源代码程序, 翻译为计算机能解读.运行的低阶机器语言的程序, 即可执行文件.而 javac 就是java语言 ...

  2. spring boot 学习笔记(二)之打包

    一.叙述 spring boot 在 pom 中可以配置成  packaging 为 jar ,这样打包出来的就是一个 jar 包,可以通过 Java 命令直接运行, Java 命令为: java - ...

  3. apache安装zip包安装(非exe)

    安装步骤如下: (1) 下载apache安装程序 进入官网:选择一个版本的apache 选择红色区域的内容,在之后进入的页面中: 选择红色区域的内容,进入页面: 现则VC9的进行下载. (2) 安装 ...

  4. java 动手动脑7

    ---恢复内容开始--- 一.动手动脑:多层的异常捕获-1 阅读以下代码(CatchWho.java),写出程序运行结果: ArrayIndexOutOfBoundsException/内层try-c ...

  5. 【POJ - 2431】Expedition(优先队列)

    Expedition 直接中文 Descriptions 一群奶牛抓起一辆卡车,冒险进入丛林深处的探险队.作为相当差的司机,不幸的是,奶牛设法跑过一块岩石并刺破卡车的油箱.卡车现在每运行一个单位的距离 ...

  6. kpm字符串匹配算法

    首先是简单的朴素匹配算法 /* * 返回子串t在主串s的位置,若不存在则返回0 */ public static int index(String s, String t) { int i = 0;/ ...

  7. mybatis一对多双向映射

    连表查询 select   id  resultType  resultMap resultType和resultMap不能同时使用 association 属性  映射到多对一中的“一”方的“复杂类 ...

  8. 使用bibtex为latex论文添加参考文献

    此文以引用Shannon的Prediction  and  Entropy  of Printed  English为例 1. bib文件 1.1 准备工作 进入Google Scholar 点击设置 ...

  9. 深入理解 linux磁盘顺序写、随机写

    一.前言 ● 随机写会导致磁头不停地换道,造成效率的极大降低:顺序写磁头几乎不用换道,或者换道的时间很短 ● 本文来讨论一下两者具体的差别以及相应的内核调用 二.环境准备 组件 版本 OS Ubunt ...

  10. Security Guards (Gym - 101954B)( bfs + 打表 )

    题意及思路 题目主要是讲先给出所有guard的位置,再给出所有incidents的位置,求出guard到达每个incident处最小的steps,其中guard每次可以向四周8个方向移动. 思路:对于 ...