题目传送门

题目要求一个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. go 学习之路(二)

    一.文件名 关键字 标识符 所有go源码都以.go结尾 标识符以字母或下划线开头,大小写敏感 a.boy b.Boy c.a+b d.0boy e._boy f.=_boy g._ 以上变量c.d.f ...

  2. JavaSE(一)Java程序的三个基本规则-组织形式,编译运行,命名规则

    一.Java程序的组织形式       Java程序是一种纯粹的面向对象的程序设计语言,因此Java程序必须以类(class)的形式存在,类(class)是Java程序的最小程序单位.       J ...

  3. Linux基础进程管理

    一.进程 了解如进程的: • PID,PPID • 当前的进程状态 • 内存的分配情况 • CPU和已花费的实际时间 • 用户UID,他决定进程的特权 (一).静态查看进程 # ps axu | le ...

  4. 5、数组的复制(test2.java、test3.java)

    对于数组的复制,在最开始的时候最容易犯的一个错误,那就是自己认为的申请一个数组,然后将已存在的数组赋值到新申请数组名上,这样是错误的,这样仅仅是将数组的地址复制了过去,并不是,将数组内的元素拷贝过去, ...

  5. java学习中碰到的疑惑和解答(二)

    路径问题是一个在平时学习和开发碰到的常见问题,对于初学者是一个比较值得研究的东西.因此对路径问题进行总结. 1. 编写路径为了告诉编译器如何找到其他资源.   2. 路径分类: 相对路径:从当前资源出 ...

  6. Guava cache使用总结

    缓存分为本地缓存和远端缓存.常见的远端缓存有Redis,MongoDB:本地缓存一般使用map的方式保存在本地内存中.一般我们在业务中操作缓存,都会操作缓存和数据源两部分.如:put数据时,先插入DB ...

  7. HTML发展历程

    HTML是超文本标记语言的缩写,不同于C或JAVA等编程语言,HTML由标签组成.通过标签可以在网页中插入文字.图片.链接.音频.视频等元素,进而描述网页.和Windows一样,随着技术的发展,HTM ...

  8. 用python实现银行家算法

    编制模拟银行家算法的程序,并以下面给出的例子验证所编写的程序的正确性. 进程 已占资源 最大需求数 资源种类 A B C D A B C D P0 0 0 1 2 0 0 1 2 P1 1 0 0 0 ...

  9. centos7单机安装kafka,进行生产者消费者测试

    [转载请注明]: 原文出处:https://www.cnblogs.com/jstarseven/p/11364852.html   作者:jstarseven    码字挺辛苦的.....  一.k ...

  10. 论文解读2——Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition

    背景 用ConvNet方法解决图像分类.检测问题成为热潮,但这些方法都需要先把图片resize到固定的w*h,再丢进网络里,图片经过resize可能会丢失一些信息.论文作者发明了SPP pooling ...