HDU 5324 Boring Class CDQ分治
题目要求一个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分治的更多相关文章
- hdu 3842 Machine Works(cdq分治维护凸壳)
		题目链接:hdu 3842 Machine Works 详细题解: HDU 3842 Machine Works cdq分治 斜率优化 细节比较多,好好体会一下. 在维护斜率的时候要考虑x1与x2是否 ... 
- HDU 5324 Boring Class【cdq分治】
		这就是一个三维排序的问题,一维递减,两维递增,这样的问题用裸的CDQ分治恰好能够解决. 如同HDU 4742(三维排序,一个三维都是递增的) 由于最小字典序比較麻烦,所以要从后面往前面做分治.每一个点 ... 
- 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 ... 
- HDU 5730 Shell Necklace cdq分治+FFT
		题意:一段长为 i 的项链有 a[i] 种装饰方式,问长度为n的相连共有多少种装饰方式 分析:采用dp做法,dp[i]=∑dp[j]*a[i-j]+a[i],(1<=j<=i-1) 然后对 ... 
- HDU 6183 Color it    cdq分治 + 线段树 + 状态压缩
		Color it Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others) Pro ... 
- 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. ... 
- HDU - 5324:Boring Class (CDQ分治&树状数组&最小字典序)
		题意:给定N个组合,每个组合有a和b,现在求最长序列,满足a不升,b不降. 思路:三位偏序,CDQ分治. 但是没想到怎么输出最小字典序,我好菜啊. 最小字典序: 我们倒序CDQ分治,ans[i]表 ... 
- HDU 3507 Print Article(CDQ分治+分治DP)
		[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3507 [题目大意] 将长度为n的数列分段,最小化每段和的平方和. [题解] 根据题目很容易得到dp ... 
- HDU 5730 Shell Necklace(CDQ分治+FFT)
		[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5730 [题目大意] 给出一个数组w,表示不同长度的字段的权值,比如w[3]=5表示如果字段长度为3 ... 
随机推荐
- 【Sublime】设置显示编码格式
			Mac 上的 Sublime 显示编码格式,设置方法: 右下角显示的 UTF-8 就是当前的编码格式. 添加如下代码: { "font_size": 18, // Display ... 
- PHP编码风格规范
			由于PHP的灵活性,很多人写起代码来也不讲求一个好的代码规范,使得本就灵活的PHP代码看起来很乱,其实PSR规范中的PSR-1和PSR-2已经定义了在PHP编码中的一些规范,只要我们好好遵守这些规范, ... 
- ArrayList 的使用方法【摘要】
			ArrayList 的使用方法 1.什么是ArrayList ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处: (1)动态的增加和减少元素 ... 
- python3学习--文件读写
			这一篇我们来看文件读写操作. 打开和创建文件主要是open()函数: f = open('filename','r') # 读模式 f = open('filename','w') # 写模式 f = ... 
- Netty学习(六)-LengthFieldBasedFrameDecoder解码器
			在TCP协议中我们知道当我们在接收消息时候,我们如何判断我们一次读取到的包就是整包消息呢,特别是对于使用了长连接和使用了非阻塞I/O的程序.上节我们也说了上层应用协议为了对消息进行区分一般采用4种方式 ... 
- Element UI系列:Upload图片自定义上传
			HTML部分代码 Javascript部分代码 CSS代码 样式部分可以自由调整 主要实现的原理是利用 http-request 的属性对上传进行自定义 
- Tunnel Warfare HDU - 1540 (线段树不同子树的合并)
			在抗日战争期间,华北平原广大地区进行了大规模的隧道战. 一般来说,通过隧道连接的村庄排成一列. 除了两端,每个村庄都与两个相邻的村庄直接相连. 入侵者经常对一些村庄发动袭击并摧毁其中的部分隧道. 八路 ... 
- GitHub项目:jkrasnay/sqlbuilder的使用
			http://www.jianshu.com/p/7f099b8cf5f0 技术选型: 在报表查询时,通常需要做可以动态添加的条件 在老项目中使用的是一种Tcondition的对象分装sql impo ... 
- 弹性盒子---CSS3布局方式
			1.弹性盒子/伸缩盒子 如果要使用弹性盒子属性,首先要将父级元素变成弹性盒子 Flex-direction 设置伸缩盒子的内部元素的排列方式 Row 从左到右安行排列 Column 从上到下按 ... 
- Source Maps简介
			提高网站性能最简单的方式之一是合并压缩JavaScript和CSS文件.但是当你需要调试这些压缩文件中的代码时,那将会是一场噩梦.不过也不用担心,souce maps将会帮你解决这一问题. Sourc ... 
