题意:给出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. [shell]在curl测试的data参数中引用变量

    在curl测试的data参数中引用变量 前言 在使用curl接口进行接口传参时,常会使用如下方法: #!/bin/bash url="http://192.168.0.10:8000/api ...

  2. 【技术积累】Linux中的命令行【理论篇】【六】

    as命令 命令介绍 在Linux中,as命令是一个汇编器,用于将汇编语言源代码转换为可执行的目标文件.它是GNU Binutils软件包的一部分,提供了一系列用于处理二进制文件的工具. 命令说明 as ...

  3. MySQL面试题全解析:准备面试所需的关键知识点和实战经验

    MySQL有哪几种数据存储引擎?有什么区别? MySQL支持多种数据存储引擎,其中最常见的是MyISAM和InnoDB引擎.可以通过使用"show engines"命令查看MySQ ...

  4. QEMU tap数据接收流程

    QEMU直接从tap/tun取数据 QEMU tap数据接收步骤: qemu从tun取数据包 qemu将数据包放入virtio硬件网卡. qemu触发中断. 虚拟机收到中断,从virtio读取数据. ...

  5. C++的编译链接与在vs中build提速

    通过gcc或msvc,clang等编译器编译出来的C++源文件是.o文件.在windows上也就是PE文件,linux为ELF文件,在这一步中,调用其它代码文件中的函数的函数地址是未知的(00000) ...

  6. charts自适应

    大屏echarts自适应文字大小 1.在utils中创建 setFontSize.js function setFontSize(val) { const baseSize = 50; let sca ...

  7. Node.js 使用 officecrypto-tool 读取加密的 Excel (xls, xlsx) 和 Word( docx)文档

    Node.js 使用 officecrypto-tool 读取加密的 Excel (xls, xlsx) 和 Word( docx)文档, 还支持 xlsx 和 docx 文件的加密(具体使用看文档) ...

  8. 命令行安装ipa包

    我们可以通过ssh连接我们的iphone,来使用命令行安装ipa包 itunnel_mux.exe --lport 9993 --iport 22 itunnel_mux.exe --lport 99 ...

  9. 研发效能|DevOps 是运维还是开发?

    DevOps 到底是 Dev还是Ops?答:属于研发工程师序列,偏向研发域,而不是运维域. DevOps是研发工程师 DevOps 主要服务的对象就是所有产研团队的人员,与产研团队打交道比较多,相互配 ...

  10. Haproxy搭建 Web 群集实现负载均衡

    Haproxy搭建 Web 群集实现负载均衡 1 Haproxy HAProxy是可提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,是免费.快速并且可靠的一种解决方案.HAProxy非常适用 ...