题目传送门

题目要求一个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. 算法与数据结构基础 - 哈希表(Hash Table)

    Hash Table基础 哈希表(Hash Table)是常用的数据结构,其运用哈希函数(hash function)实现映射,内部使用开放定址.拉链法等方式解决哈希冲突,使得读写时间复杂度平均为O( ...

  2. oracle 创建表空间,用户并授权

    1. 查看所有表空间及存储路径 select file_name, tablespace_name from dba_data_files; 2. 创建表空间 CREATE TABLESPACE xs ...

  3. 基于http(s)协议的模板化爬虫设计

    声明:本文为原创,转载请注明出处 本文总共三章,前面两章废话吐槽比较多,想看结果的话,直接看第三章(后续会更新,最近忙着毕设呢,毕设也是我自己做的,关于射频卡的,有时间我也放上来,哈哈). 一,系统总 ...

  4. cinder支持nfs快照

    [问题描述] cinder后端设置为NFS,磁盘创建快照失败. 日志里面发现了这个错误: VolumeDriverException: Volume driver reported an error: ...

  5. 微信小程序云开发报错解决: Setting data field "openid" to undefined is invalid.

    最近在学习微信小程序云开发,刚一开始就遇到了问题. 点击获取openid的时候控制台开始报错: [云函数] [login] user openid:  undefined VM97:1 Setting ...

  6. LeetCode——372. Super Pow

    题目链接:https://leetcode.com/problems/super-pow/description/ Your task is to calculate ab mod 1337 wher ...

  7. CMake入门-02-HelloWorld扩展

    工作环境 系统:macOS Mojave 10.14.6 CMake: Version 3.15.0-rc4 Hello,World! 扩展-同一目录,多个源文件 (1) 新建 hello 目录,创建 ...

  8. I firmly believe

    I firmly believe, what you plant now, you will harvest later.

  9. mssql server master 数据库还原

    今天想试一下master数据库还原,在进入单用户模式的时候,在命令行输入sqlserver.exe -c -f -m结果显示 'sqlserver.exe' 不是内部或外部命令,也不是可运行的程序或批 ...

  10. (转载)分享常用的GoLang包工具

    分享常用的GoLang包工具 包名 链接地址 备注 Machinery异步队列 https://github.com/RichardKnop/machinery Mqtt通信 github.com/e ...