题意:给出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. 我也来扒一扒python的内存回收机制!

    python的内存回收是面试中经常会问到一个问题,今天我来给大家深度剖析下python的内存回收和缓存机制 1.引用计数器 我们知道,python是通过引用计数器来做内存回收的,下面我们来重点讲下引用 ...

  2. Linux下后台运行Java程序

    1.背景描述 用Java编写了一个程序(可执行的jar),需要在Linux中启动并持续运行 1.1.直接执行程序 直接执行程序后,在程序执行期间,无法在当前会话中再执行其他操作 1.2.直接执行程序后 ...

  3. 《Kali渗透基础》07. 弱点扫描(一)

    @ 目录 1:漏洞发现 1.1:Exploit-DB 1.2:searchsploit 1.3:nmap 2:漏洞管理 3:弱点扫描类型 4:漏洞基本概念 4.1:CVSS 4.2:CVE 4.3:O ...

  4. QA|20221001|SecureCRT自动断开怎么办?

    Q:SecureCRT自动断开怎么办? A:如下设置

  5. JS深入学习笔记 - 第一章.构造函数原型与原型链

    1.构造函数和原型 1.1 概述 在典型的 OOP语言中(如Java),都存在类的概念,类就是对象的模板,对象就是类的实例,但在ES6之前,JS并没有引入类的概念. 在ES6之前,对象不是基于类创建的 ...

  6. 织梦DEDEBIZ调用全站文章数量

    织梦DEDEBIZ如何调用全站文章数量{dede:sql sql="select count(*) as c from biz_archives} 共有文章:[field:c/] 篇 {/d ...

  7. Strimzi Kafka Bridge(桥接)实战之三:自制sdk(golang版本)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是<Strimzi Kafka B ...

  8. CUDA C编程权威指南:2.1-CUDA编程模型

      本文主要通过例子介绍了CUDA异构编程模型,需要说明的是Grid.Block和Thread都是逻辑结构,不是物理结构.实现例子代码参考文献[2],只需要把相应章节对应的CMakeLists.txt ...

  9. [ARC143B] Counting Grids 题解

    Counting Grids 题目大意 将 \(1\sim n^2\) 填入 \(n\times n\) 的网格 \(A\) 中,对于每个格子满足以下条件之一: 该列中存在大于它的数. 该行中存在小于 ...

  10. log4j漏洞CVE-2021-44228复现-排雷篇

    一.环境搭建(用相同的环境才能保证一定成功) 下载vulhub,其他环境可能存在GET请求无效问题: git clone https://github.com/vulhub/vulhub.git 切换 ...