[Luogu 3810]三维偏序
Description
有 $ n $ 个元素,第 $ i $ 个元素有 $ a_i $ 、$ b_i $ 、$ c_i $ 三个属性,设 $ f(i) $ 表示满足 $ a_j \leq a_i $ 且 $ b_j \leq b_i $ 且 $ c_j \leq c_i $ 的 $ j $ 的数量。
对于 $ d \in [0, n) $ ,求 $ f(i) = d $ 的数量
Input
第一行两个整数 $ n $ 、$ k $ ,分别表示元素数量和最大属性值。
之后 $ n $ 行,每行三个整数 $ a_i $ 、$ b_i $ 、$ c_i $ ,分别表示三个属性值。
Output
输出 $ n $ 行,第 $ d + 1 $ 行表示 $ f(i) = d $ 的 $ i $ 的数量。
Sample Input
10 3
3 3 3
2 3 3
2 3 1
3 1 1
3 1 2
1 3 1
1 1 2
1 2 2
1 3 2
1 2 1
Sample Output
3
1
3
0
1
0
1
0
0
1
Hint
$ 1 \leq n \leq 100000, 1 \leq k \leq 200000 $
题解
$CDQ$ 分治模板题。
三维:
第一维 $sort$ 排序
第二维 $CDQ$
第三维 $bittree$
我们将第一维排序后,我们用递归实现 $CDQ$ ,取 $mid$ ,算出 $mid$ 左边对 $mid$ 右边的贡献。
用 $bittree$ 来维护最后一维的大小关系。
#include<set>
#include<map>
#include<cmath>
#include<ctime>
#include<queue>
#include<stack>
#include<cstdio>
#include<string>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define lowbit(x) ((x)&-(x))
using namespace std;
const int N=;
const int K=; struct point
{
int a,b,c,cnt,ans;
}g[N+];
int n,m,ans[N+],c[K+],num;
bool cmp2(point x,point y) {return x.b==y.b ? x.c<y.c:x.b<y.b;}
bool cmp1(point x,point y) {return x.a==y.a ? cmp2(x,y):x.a<y.a;}
void Add(int x,int y) {for (;x<=m;x+=lowbit(x)) c[x]+=y;}
int Count(int x)
{
int r=;
for (;x;x-=lowbit(x)) r+=c[x];
return r;
}
void CDQ(int l,int r)
{
if(l==r) return;
int mid=(l+r)>>;
CDQ(l,mid);
CDQ(mid+,r);
sort(g+l,g+mid+,cmp2);
sort(g+mid+,g+r+,cmp2);
int t1=l,t2=mid+;
while(t2<=r)
{
while(t1<=mid&&g[t1].b<=g[t2].b)
{
Add(g[t1].c,g[t1].cnt);
t1++;
}
g[t2].ans+=Count(g[t2].c);
t2++;
}
for (int i=l;i<=t1-;i++) Add(g[i].c,-g[i].cnt);
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++) scanf("%d%d%d",&g[i].a,&g[i].b,&g[i].c),g[i].cnt=;
sort(g+,g+n+,cmp1);
for (int i=;i<=n;i++)
{
int k=i+;
while(g[i].a==g[k].a&&g[i].b==g[k].b&&g[i].c==g[k].c) k++;
num++;
k--;
g[i].cnt+=k-i;
g[num]=g[i];
i=k;
}
CDQ(,num);
for (int i=;i<=num;i++) ans[g[i].ans+g[i].cnt-]+=g[i].cnt;
for (int i=;i<n;i++) printf("%d\n",ans[i]);
return ;
}
[Luogu 3810]三维偏序的更多相关文章
- luogu P3810 三维偏序(陌上花开)cdq分治
题目链接 思路 对一维排序后,使用$cdq$分治,以类似归并排序的方法处理的二维,对于满足$a[i].b \leq a[j].b$的点对,用树状数组维护$a[i].c$的数量.当遇到$a[i].b&g ...
- Luogu 3810 & BZOJ 3262 陌上花开/三维偏序 | CDQ分治
Luogu 3810 & BZOJ 3263 陌上花开/三维偏序 | CDQ分治 题面 \(n\)个元素,每个元素有三个值:\(a_i\), \(b_i\) 和 \(c_i\).定义一个元素的 ...
- BZOJ3262:陌上花开 & 洛谷3810:三维偏序——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=3262 https://www.luogu.org/problemnew/show/3810 Desc ...
- Luogu P3810 【模板】三维偏序(陌上花开)(CDQ分治)
题目 以三维偏序为例来讲一下CDQ分治. CDQ的本质就是把一个序列分成两段,计算左边对右边的贡献,然后分治. 不过一般都是先分治到底再从下往上算,这样可以先归并再算. 比如这道题,我们先按第一维排序 ...
- 洛谷P3810-陌上开花(三维偏序, CDQ, 树状数组)
链接: https://www.luogu.org/problem/P3810#submit 题意: 一个元素三个属性, x, y, z, 给定求f(b) = {ax <= bx, ay < ...
- SPOJ LIS2 Another Longest Increasing Subsequence Problem 三维偏序最长链 CDQ分治
Another Longest Increasing Subsequence Problem Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://a ...
- BZOJ 3262: 陌上花开 [CDQ分治 三维偏序]
Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...
- 洛谷P3810 陌上花开 CDQ分治(三维偏序)
好,这是一道三维偏序的模板题 当然没那么简单..... 首先谴责洛谷一下:可怜的陌上花开的题面被无情的消灭了: 这么好听的名字#(滑稽) 那么我们看了题面后就发现:这就是一个三维偏序.只不过ans不加 ...
- BZOJ3262/洛谷P3810 陌上花开 分治 三维偏序 树状数组
原文链接http://www.cnblogs.com/zhouzhendong/p/8672131.html 题目传送门 - BZOJ3262 题目传送门 - 洛谷P3810 题意 有$n$个元素,第 ...
随机推荐
- 20155303 2016-2017-2 《Java程序设计》第二周学习总结
20155303 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 『注意』 "//"为单行批注符: "/*"与&quo ...
- SaaS的那些事儿
前两年... 大一大二期间,不知道软件架构.云服务器.数据库为何物,偶尔听过却从未用过.天天学的写的东西都是一些命令行代码,所幸在学完<数据结构>和<算法导论>后能够独立实 ...
- ExecutorService,另一种服务,线程
http://heipark.iteye.com/blog/1393847 Executors.newFixedThreadPool和ArrayBlockingQueue一点使用心得 博客 ...
- 【iOS】swift-通过JS获取webView的高度
let webHeightStr = webView.stringByEvaluatingJavaScriptFromString("document.body.scrollHeight& ...
- SQL SERVER 游标的使用
首先,关于什么是游标大家可以看看这篇文章,介绍得非常详细!! SQL Server基础之游标 下面是我自己的应用场景-- 有个需求,需要把数据库表里面某一个字段的值设为随机不重复的值. 表是这样的: ...
- ajax 操作
ajax 操作 ajax呢,就是要做到在神不知鬼不觉的情况之下给服务端发送请求. ajax能干啥哩? 这,,,,: 利用AJAX可以做:1.注册时,输入用户名自动检测用户是否已经存在.2.登陆时,提示 ...
- Leetcode:Two Sum
原题:https://leetcode.com/problems/two-sum/ 尝试了两种方法: 方法一: var twoSum = function(nums, target) { for(va ...
- 大数据学习总结(4)参考splunk架构
- 新概念英语(1-41)Penny's bag
新概念英语(1-41)Penny's bag Who is the tin of tobacco for? A:Is that bag heavy, Penny? B:Not very. A:Here ...
- python入门(13)获取函数帮助和调用函数
Python内置了很多有用的函数,我们可以直接调用. 要调用一个函数,需要知道函数的名称和参数,比如求绝对值的函数abs,只有一个参数.可以直接从Python的官方网站查看文档: http://doc ...