题意:给出n个三维点对(x,y,z),可随意排列,求三维非严格最长上升子序列长度和最长上升子序列数量。

输入格式:第一行为一整数T表示用例组数,每组用例第一行为一整数n表示点数,之后n行每行三个整数x,y,z表示一个点。

输出格式:对于每组用例,输出两个整数分别表示三维非严格最长上升子序列长度和最长上升子序列数量。

#include<cstdio>
#include<algorithm>
#define mid ((l + r) >> 1)
#define mp(a, b) make_pair(a, b)
#define fi first
#define se second
using namespace std;
const int N = 1e5 + 5; typedef pair<int, int> pii; int t, n, x, y, z, len;
int kk[N];
pii dp[N], c[N]; struct Point{
int x, y, z, id;
}p[N], temp[N]; bool cmp1(const Point &a, const Point &b) { return a.x < b.x; } bool cmp2(const Point &a, const Point &b) { return a.y < b.y; } inline int lowbit(int x) { return x & -x; } pii ask(int x){
pii ans = mp(0, 0);
while(x){
if(c[x].fi > ans.fi) ans = c[x];
else if(c[x].fi == ans.fi) ans.se += c[x].se;
x -= lowbit(x);
}
return ans;
} void modify(int x, pii k){
while(x <= len){
if(c[x].fi < k.fi) c[x] = k;
else if(c[x].fi == k.fi) c[x].se += k.se;
x += lowbit(x);
}
} void clear(int x){
while(x <= len){
c[x] = mp(0, 0);
x += lowbit(x);
}
} void CDQ(int l, int r){
if(l == r) return ;
CDQ(l, mid);
for(int i = l; i <= r; ++i) temp[i] = p[i];
sort(temp + l, temp + r + 1, cmp2);
for(int i = l; i <= r; ++i){
if(temp[i].id > mid){
int id = temp[i].id;
pii q = ask(temp[i].z);
++q.first;
if(dp[id].fi < q.fi) dp[id] = q;
else if(dp[id].fi == q.fi) dp[id].se += q.se;
}
else modify(temp[i].z, dp[temp[i].id]);
}
for(int i = l; i <= r; ++i) if(temp[i].id <= mid) clear(temp[i].z);
CDQ(mid + 1, r);
} int main(){
scanf("%d", &t);
while(t--){
scanf("%d", &n);
for(int i = 1; i <= n; ++i) dp[i].fi = dp[i].se = 1;
for(int i = 1; i <= n; ++i){
scanf("%d%d%d", &x, &y, &z);
p[i] = Point{x, y, z, i};
kk[i] = z;
}
sort(p + 1, p + 1 + n, cmp1);
sort(kk + 1, kk + 1 + n);
len = unique(kk + 1, kk + 1 + n) - kk - 1;
for(int i = 1; i <= n; ++i) p[i].z = lower_bound(kk + 1, kk + 1 + len, p[i].z) - kk, p[i].id = i;
CDQ(1, n);
pii ans = mp(0, 0);
for(int i = 1; i <= n; ++i){
if(dp[i].fi > ans.fi) ans = dp[i];
else if(dp[i].fi == ans.fi) ans.se += dp[i].se;
}
printf("%d %d\n", ans.fi, ans.se);
}
return 0;
}

Hdu4742 (CDQ分治)的更多相关文章

  1. HDU4742 CDQ分治,三维LIS

    HDU4742 CDQ分治,三维LIS 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4742 题意: 每个球都有三个属性值x,y,z,要求最长的lis的 ...

  2. bryce1010专题训练——CDQ分治

    Bryce1010模板 CDQ分治 1.与普通分治的区别 普通分治中,每一个子问题只解决它本身(可以说是封闭的) 分治中,对于划分出来的两个子问题,前一个子问题用来解决后一个子问题而不是它本身 2.试 ...

  3. 【教程】简易CDQ分治教程&学习笔记

    前言 辣鸡蒟蒻__stdcall终于会CDQ分治啦!       CDQ分治是我们处理各类问题的重要武器.它的优势在于可以顶替复杂的高级数据结构,而且常数比较小:缺点在于必须离线操作. CDQ分治的基 ...

  4. BZOJ 2683 简单题 ——CDQ分治

    [题目分析] 感觉CDQ分治和整体二分有着很本质的区别. 为什么还有许多人把他们放在一起,也许是因为代码很像吧. CDQ分治最重要的是加入了时间对答案的影响,x,y,t三个条件. 排序解决了x ,分治 ...

  5. HDU5618 & CDQ分治

    Description: 三维数点 Solution: 第一道cdq分治...感觉还是很显然的虽然题目不能再傻逼了... Code: /*=============================== ...

  6. 初识CDQ分治

    [BZOJ 1176:单点修改,查询子矩阵和]: 1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 200 ...

  7. HDU5322 Hope(DP + CDQ分治 + NTT)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5322 Description Hope is a good thing, which can ...

  8. BZOJ4170 极光(CDQ分治 或 树套树)

    传送门 BZOJ上的题目没有题面-- [样例输入] 3 5 2 4 3 Query 2 2 Modify 1 3 Query 2 2 Modify 1 2 Query 1 1 [样例输出] 2 3 3 ...

  9. BZOJ2683 简单题(CDQ分治)

    传送门 之前听别人说CDQ分治不难学,今天才知道果真如此.之前一直为自己想不到CDQ的方法二很不爽,今天终于是想出来了一道了,太弱-- cdq分治主要就是把整段区间分成两半,然后用左区间的值去更新右区 ...

  10. BNUOJ 51279[组队活动 Large](cdq分治+FFT)

    传送门 大意:ACM校队一共有n名队员,从1到n标号,现在n名队员要组成若干支队伍,每支队伍至多有m名队员,求一共有多少种不同的组队方案.两个组队方案被视为不同的,当且仅当存在至少一名队员在两种方案中 ...

随机推荐

  1. msfvenom参数简介

    -p, –payload < payload> 指定需要使用的payload(攻击荷载).也可以使用自定义payload,几乎是支持全平台的 -l, –list [module_type] ...

  2. WPF的前世今生

    1.WPF的布局 WPF的布局分为相对定位和绝对定位两种. 绝对定位一般用Canvas 相对定位一般用Grid.StackPanel.DockPanel.WrapPanel 2.MVVM模式是什么 M ...

  3. 新一代Kerberos攻击 钻石票据与蓝宝石票据

    新一代Kerberos攻击 | 钻石票据与蓝宝石票据 0x01 前言 在了解票据攻击的过程中,看见了一篇文章使用Rubeus进行钻石票据攻击.但是没有原理,于是抱着学习的心态在Google上寻找文章发 ...

  4. 《SQL与数据库基础》11. 索引

    目录 索引 概述 结构 B-Tree B+Tree Hash 思考 分类 语法 SQL性能分析 SQL执行频率 慢查询日志 profile详情 explain执行计划 索引失效情况 范围查询 索引列运 ...

  5. RocketMQ 系列(二) 环境搭建

    RocketMQ 系列(二) 环境搭建 上一个章节对于 RocketMQ 作了一些概念上的介绍,如果你对于 RocketMQ 没有概念,不妨先看RocketMQ系列(一) 基本介绍. 这个章节主要介绍 ...

  6. 开源XL-LightHouse与Flink、ClickHouse之类技术相比有什么优势

    Flink是一款非常优秀的流式计算框架,而ClickHouse是一款非常优秀的OLAP类引擎,它们是各自所处领域的佼佼者,这一点是毋庸置疑的.Flink除了各种流式计算场景外也必然可以用于流式统计,C ...

  7. 使用GPU训练Pytorch模型

    如何使用GPU训练Pytorch模型 这两天的深度学习实验真实让人头疼,传说中的"猫狗大战",对模型的训练用CPU的话9h起步,12h是常态,大学生哪耗得起,因此查找资料搭建了GP ...

  8. Java新特性中的Preview功能如何运行和调试

    在每个Java新版本发布的特性中,都会包含一些Preview(预览)功能,这些功能主要用来给开发者体验并收集建议.所以,Preview阶段的功能并不是默认开启的. 如果想体验某个Java版本中的Pre ...

  9. Django框架项目之支付功能——支付宝支付

    文章目录 支付宝支付 入门 支付流程 aliapy二次封装包 GitHub开源框架 依赖 结构 alipay_public_key.pem app_private_key.pem setting.py ...

  10. Linux系列教程——Linux磁盘管理、Linux进程管理、Linux系统服务、 Linux计划任务

    @ 目录 1 Linux磁盘管理 1.磁盘的基本概念 1.什么是磁盘 2.磁盘的基本结构 3.磁盘的预备知识 1.磁盘的接口类型 2.磁盘的基本术语 3.磁盘在系统上的命名方式 4.磁盘基本分区Fdi ...