三维偏序(陌上花开) CDQ分治
十分巧妙。
Code:
#include <cstdio>
#include <algorithm>
#include <cstring>
#define setIO(s) freopen(s".in","r",stdin)
#define maxn 200000
#define N 3000000
#define ll long long
using namespace std;
int k,n;
int C[N],ans[maxn],cnt[maxn];
int lowbit(int x){ return x&(-x); }
void add(int pos,int x){
while(pos<=k) C[pos]+=x,pos+=lowbit(pos);
}
int query(int pos){
int sum=0;
while(pos>0) sum+=C[pos],pos-=lowbit(pos);
return sum;
}
struct OPT{
int x,y,z,w,idx;
}arr[maxn],opt[maxn];
int cmpx(OPT a,OPT b){ return (a.x==b.x&&a.y==b.y)?(a.z<b.z):((a.x==b.x)?a.y<b.y:a.x<b.x); }
int cmpy(OPT a,OPT b){ return (a.y==b.y)?a.z<b.z:a.y<b.y; }
void solve(int l,int r){
if(l>=r) return;
int mid=(l+r)>>1;
solve(l,mid),solve(mid+1,r);
sort(opt+l,opt+mid+1,cmpy),sort(opt+mid+1,opt+r+1,cmpy);
int p=l,q=mid+1;
for(;q<=r;++q){
while(opt[p].y<=opt[q].y&&p<=mid) add(opt[p].z,opt[p].w),++p;
ans[opt[q].idx]+=query(opt[q].z);
}
for(int i=l;i<p;++i) add(opt[i].z,-opt[i].w);
}
int main()
{
//setIO("input");
scanf("%d%d",&n,&k);
for(int i=1;i<=n;++i)scanf("%d%d%d",&arr[i].x,&arr[i].y,&arr[i].z);
sort(arr+1,arr+1+n,cmpx);
int u=n,cc=0;
n=0;
for(int i=1;i<=u;++i){
++cc;
if(arr[i].x!=arr[i+1].x||arr[i].y!=arr[i+1].y||arr[i].z!=arr[i+1].z)
opt[++n]=arr[i],opt[n].w=cc,opt[n].idx=n,cc=0;
}
solve(1,n);
for(int i=1;i<=n;i++)
cnt[ans[opt[i].idx]+opt[i].w-1]+=opt[i].w;
for(int i=0;i<u;++i) printf("%d\n",cnt[i]);
return 0;
}
三维偏序(陌上花开) CDQ分治的更多相关文章
- BZOJ3262: 陌上花开(三维偏序,CDQ分治)
Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),用三个整数表示. 现在要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量. 定义一朵花A比另一朵花B要美 ...
- HDU 5618 Jam's problem again(三维偏序,CDQ分治,树状数组,线段树)
Jam's problem again Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Othe ...
- hdu5618 (三维偏序,cdq分治)
给定空间中的n个点,问每个点有多少个点小于等于自己. 先来分析简单的二维的情况,那么只要将x坐标排序,那么这样的问题就可以划分为两个子问题,,这样的分治有一个特点,即前一个子问题的解决是独立的,而后一 ...
- P3810 陌上花开 CDQ分治
陌上花开 CDQ分治 传送门:https://www.luogu.org/problemnew/show/P3810 题意: \[ 有n 个元素,第 i 个元素有 a_i. b_i. c_i 三个属性 ...
- 洛谷P3810 陌上花开 CDQ分治(三维偏序)
好,这是一道三维偏序的模板题 当然没那么简单..... 首先谴责洛谷一下:可怜的陌上花开的题面被无情的消灭了: 这么好听的名字#(滑稽) 那么我们看了题面后就发现:这就是一个三维偏序.只不过ans不加 ...
- BZOJ 3262: 陌上花开 [CDQ分治 三维偏序]
Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...
- 【BZOJ-3262】陌上花开 CDQ分治(3维偏序)
3262: 陌上花开 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1439 Solved: 648[Submit][Status][Discuss ...
- bzoj3262陌上花开 cdq分治
3262: 陌上花开 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 2794 Solved: 1250[Submit][Status][Discus ...
- N维偏序:cdq分治
cdq(陈丹琦)分治,是一种类似二分的算法.基本思想同分治: 递归,把大问题划分成若干个结构相同的子问题,直到(L==R): 处理左区间[L,mid]对右区间[mid+1,R]的影响: 合并. 它可以 ...
- bzoj3262: 陌上花开(cdq分治+树状数组)
3262: 陌上花开 题目:传送门 题解: %%%cdq分治 很强大的一个暴力...感觉比分块高级多了 这道题目就是一个十分经典的三维偏序的例题: 一维直接暴力排序x 二维用csq维护y 三维用树状数 ...
随机推荐
- yum概述配置
YUM(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器.基于RPM包管理,能够从指定的服务器自动下载 ...
- windows快速找到host文件
https://jingyan.baidu.com/article/1e5468f96f7345484961b71e.html
- Codeforces 988E. Divisibility by 25
解题思路: 只有尾数为25,50,75,00的数才可能是25的倍数. 对字符串做4次处理,以25为例. a. 将字符串中的最后一个5移到最后一位.计算交换次数.(如果没有找到5,则不可能凑出25,考虑 ...
- 【原创】Apache和基于虚拟主机的Tomcat集群方案
最近建设了北京某政府机构的网站,网站前段使用Apache做负载均衡,后端使用Tomcat做的集群,基于虚拟主机的方式访问,并且实现了静态资源和动态资源的分离. 开始的建设方案有两种,一种是使用apac ...
- Hadoop_MapReduce中Mapper类和Reduce类
在权威指南中,有个关于处理温度的MapReduce类,具体如下: 第一部分:Map public class MaxTemperatureMapper extends MapReduceBase im ...
- 洛谷 P1462 通往奥格瑞玛的道路 二分 最短路
#include<cstdio> #include<queue> #include<cstring> #include<algorithm> using ...
- SKU和SPU表的设计
1.什么是SKU,SPU SKU:Stock Keeping Unit (库存量单位)SKU即库存进出计量的单位,可以是以件.盒.托盘等为单位,是物理上不可分割的最小存货单元.在使用时要根据不同业态, ...
- Ibatis使用技巧
一.在ibatis中以Map形式返回查询结果 1.在ibatis的配置文件中配置以HashMap返回的resultMap <resultMap id="MAX_MIN_ID_RESUL ...
- 系统级脚本 rpcbind
[root@web02 ~]# vim /etc/init.d/rpcbind #! /bin/sh # # rpcbind Start/Stop RPCbind # # chkconfig: 234 ...
- 紫书 习题 11-10 UVa 12264 (二分答案+最大流)
书上写的是UVa 12011, 实际上是 12264 参考了https://blog.csdn.net/xl2015190026/article/details/51902823 这道题就是求出一种最 ...