hdu5618
题解:
CDQ分治
三重分治
第一重排序
第二重CDQ
第三重树状数组
代码:
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
int n,m,c[N],dp[N],T;
struct node
{
int x,y,z,id;
}a[N],tmp[N];
struct Tree
{
int c[N];
inline int low(int x){return x&-x;}
inline void modify(int x){while (x<=N-)c[x]=,x+=low(x);}
inline void updata(int x){while (x<=N-)c[x]++,x+=low(x);}
inline void init(){memset(c,,sizeof c);}
inline int query(int x)
{
int ans=;
while (x)ans+=c[x],x-=low(x);
return ans;
}
}Tree;
inline int cmp(node x,node y)
{
if (x.x!=y.x)return x.x<y.x;
if (x.y!=y.y)return x.y<y.y;
return x.z<y.z;
}
inline int cmp1(node x,node y)
{
if (x.y!=y.y)return x.y<y.y;
return x.z<y.z;
}
inline void solve(int l,int r)
{
if (l==r)return;
int m=(l+r)>>;
solve(l,m);
for (int i=l;i<=r;i++)tmp[i]=a[i];
sort(tmp+l,tmp+m+,cmp1);
sort(tmp+m+,tmp+r+,cmp1);
int pl=l;
for (int i=m+;i<=r;i++)
{
while (pl<=m&&tmp[pl].y<=tmp[i].y)
{
Tree.updata(tmp[pl].z);
pl++;
}
dp[tmp[i].id]+=Tree.query(tmp[i].z);
}
for (int i=l;i<=m;i++)Tree.modify(tmp[i].z);
solve(m+,r);
}
inline int read()
{
int x=;char c;
for (;c<''||c>'';c=getchar());
for (;c>=''&&c<='';c=getchar())x=x*+c-;
return x;
}
inline void write(int x)
{
if (x>=)write(x/);
putchar(x%+);
}
int main()
{
scanf("%d",&T);
while (T--)
{
scanf("%d",&n);
for (int i=;i<=n;i++)
{
a[i].x=read();
a[i].y=read();
a[i].z=read();
a[i].id=i;
}
sort(a+,a+n+,cmp);
memset(dp,,sizeof dp);
Tree.init();
solve(,n);
for (int i=n-;i;i--)
if (a[i].x==a[i+].x&&a[i].y==a[i+].y&&a[i].z==a[i+].z)
dp[a[i].id]=dp[a[i+].id];
for (int i=;i<=n;i++)write(dp[i]),puts("");
}
}
hdu5618的更多相关文章
- HDU5618 & CDQ分治
Description: 三维数点 Solution: 第一道cdq分治...感觉还是很显然的虽然题目不能再傻逼了... Code: /*=============================== ...
- HDU5618 Jam's problem again
CDQ分治模板题 #include<cstdio> #include<cctype> #include<algorithm> #include<cstring ...
- hdu5618 (三维偏序,cdq分治)
给定空间中的n个点,问每个点有多少个点小于等于自己. 先来分析简单的二维的情况,那么只要将x坐标排序,那么这样的问题就可以划分为两个子问题,,这样的分治有一个特点,即前一个子问题的解决是独立的,而后一 ...
- hdu5618(cdq分治求三维偏序)
题意:给n(n<=100000)个点,坐标为(xi,yi,zi)(1<=xi,yi,zi<=100000),定义一个点A比一个点B小,当且仅当xA<=xB,yA<=yB, ...
- HDU5618 Jam's problem again CDQ分治
Jam's problem again CDQ分治 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=5618 题意: \[ 有n 个元素,第 i 个元素有 ...
随机推荐
- Python开发【模块】:matplotlib 绘制折线图
matplotlib 1.安装matplotlib ① linux系统安装 # 安装matplotlib模块 $ sudo apt-get install python3-matplotlib # 如 ...
- 第1章 1.3计算机网络概述--规划IP地址介绍MAC地址
IP地址的作用是:指定发送数据者和接收数据者. MAC地址的作用:指定数据包的下一跳转设备.就是说明数据下一步向谁发. 路由器的作用:在不同的网段中转发数据.路由器本质就是有2个网卡的设备. 网卡:用 ...
- Hadoop集群完全分布式坏境搭建
前言 上一篇我们讲解了Hadoop单节点的安装,并且已经通过VMware安装了一台CentOS 6.8的Linux系统,咱们本篇的目标就是要配置一个真正的完全分布式的Hadoop集群,闲言少叙,进入本 ...
- Openstack(十三)部署管理服务horizon
13.1horizon介绍 horizon是openstack的管理其他组件的图形显示和操作界面,通过API和其他服务进行通讯,如镜像服务.计算服务和网络服务等结合使用,horizon基于python ...
- php://input、$_POST与$GLOBALS['HTTP_RAW_POST_DATA']三者的区别
$_POST 只有Coentent-Type的值为application/x-www.form-urlencoded和multipart/form-data两种类型时,$_POST才能获取到数据. $ ...
- Status Code状态码详解对照表
状态码 含义 100 客户端应当继续发送请求.这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝.客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应.服务器必须在 ...
- laravel 项目部署注意事项
1.'Failed to open stream: Permission denied' error - Laravel Laravel >= 5.4 php artisan cache:cle ...
- extern--C#调用C++等其他非托管代码
例如: https://www.cnblogs.com/sosoft/p/extern.html
- nodejs 8 利用原生 util.promisify() 实现 promise.delay()
Nodejs 8 在 util 包里新增了 promisify() .这个方法基本和 bluebird 的 promisify() 作用一样,即把最后一个参数是 callback 函数的函数变成返回 ...
- 【Java----判断字符串是否为有效的日期格式】
public static boolean isValidDate(String str) { boolean convertSuccess=true; // 指定日期格式为四位年/两位月份/两位日期 ...