Hdu4742 (CDQ分治)
题意:给出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分治)的更多相关文章
- HDU4742 CDQ分治,三维LIS
HDU4742 CDQ分治,三维LIS 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4742 题意: 每个球都有三个属性值x,y,z,要求最长的lis的 ...
- bryce1010专题训练——CDQ分治
Bryce1010模板 CDQ分治 1.与普通分治的区别 普通分治中,每一个子问题只解决它本身(可以说是封闭的) 分治中,对于划分出来的两个子问题,前一个子问题用来解决后一个子问题而不是它本身 2.试 ...
- 【教程】简易CDQ分治教程&学习笔记
前言 辣鸡蒟蒻__stdcall终于会CDQ分治啦! CDQ分治是我们处理各类问题的重要武器.它的优势在于可以顶替复杂的高级数据结构,而且常数比较小:缺点在于必须离线操作. CDQ分治的基 ...
- BZOJ 2683 简单题 ——CDQ分治
[题目分析] 感觉CDQ分治和整体二分有着很本质的区别. 为什么还有许多人把他们放在一起,也许是因为代码很像吧. CDQ分治最重要的是加入了时间对答案的影响,x,y,t三个条件. 排序解决了x ,分治 ...
- HDU5618 & CDQ分治
Description: 三维数点 Solution: 第一道cdq分治...感觉还是很显然的虽然题目不能再傻逼了... Code: /*=============================== ...
- 初识CDQ分治
[BZOJ 1176:单点修改,查询子矩阵和]: 1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 200 ...
- HDU5322 Hope(DP + CDQ分治 + NTT)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5322 Description Hope is a good thing, which can ...
- 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 ...
- BZOJ2683 简单题(CDQ分治)
传送门 之前听别人说CDQ分治不难学,今天才知道果真如此.之前一直为自己想不到CDQ的方法二很不爽,今天终于是想出来了一道了,太弱-- cdq分治主要就是把整段区间分成两半,然后用左区间的值去更新右区 ...
- BNUOJ 51279[组队活动 Large](cdq分治+FFT)
传送门 大意:ACM校队一共有n名队员,从1到n标号,现在n名队员要组成若干支队伍,每支队伍至多有m名队员,求一共有多少种不同的组队方案.两个组队方案被视为不同的,当且仅当存在至少一名队员在两种方案中 ...
随机推荐
- Go 如何正确关闭通道
序言 Go 在通道这一块,没有内置函数判断通道是否已经关闭,也没有可以直接获取当前通道数量的方法.所以对于通道,Go 显示的不是那么优雅.另外,如果对通道进行了错误的使用,将会直接引发系统 panic ...
- 《SQLi-Labs》01. Less 1~5
@ 目录 前言 索引 Less-1 题解 原理 Less-2 题解 Less-3 题解 Less-4 题解 Less-5 题解 原理 sqli.开启新坑. 前言 对于新手,为了更加直观的看到 sql ...
- 使用 SQL 的方式查询消息队列数据以及踩坑指南
背景 为了让业务团队可以更好的跟踪自己消息的生产和消费状态,需要一个类似于表格视图的消息列表,用户可以直观的看到发送的消息:同时点击详情后也能查到消息的整个轨迹. 消息列表 点击详情后查看轨迹 原理介 ...
- 如何理解SpringBoot的Starter
Starter是SpringBoot的四大核心功能特性之一,除此之外,SpringBoot还有自动装配,Actuator监控等特性 SpringBoot里面的这些特性,都是为了让开发者在开发基于Spr ...
- java循环自动生成简单图片
import java.awt.*; import java.awt.font.FontRenderContext; import java.awt.geom.Rectangle2D; import ...
- MySQL中不同场景中排它锁的不同表现
mysql5.7 Golang的gorm做的测试 最后结论如下: 按主键查询,只会锁查到的那条数据 按主键加其他字段查询同上, 按照非主键字段查询,查到查不到都会造成表锁 (以上的锁指排他锁) 排它锁 ...
- T-SQL——关于数据合并(Merge)
目录 0. 背景说明及测试数据 1. 直接清空,重新插入 2. 单条记录执行插入.更新操作 3. Merge函数 3.1 准备测试数据 3.2 测试Merge 3.3 关于Merge 4.参考 sha ...
- BY组态-低代码web可视化组件
简介 BY组态是贵州九元四方科技完全自主研发的集实时数据展示.动态交互等一体的全功能可视化平台.帮助物联网.工业互联网.电力能源.水利工程.智慧农业.智慧医疗.智慧城市等场景快速实现数字孪生.大屏可视 ...
- iOS16新特性:实时活动-在锁屏界面实时更新APP消息
简介 之前在 <iOS16新特性:灵动岛适配开发与到家业务场景结合的探索实践> 里介绍了iOS16新的特性:实时更新(Live Activity)中灵动岛的适配流程,但其实除了灵动岛的展示 ...
- Java21上手体验-分代ZGC和虚拟线程
一.导语 几天前Oracle刚刚发布了Java21, 由于这是最新的LTS版本,引起了大家的关注. 我也第一时间在个人项目中进行了升级体验. 一探究竟,和大家分享. 二.Java21更新内容介绍 官方 ...