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 个元素有 ...
随机推荐
- vue - vue
一.vue - 介绍 vue的作者叫尤雨溪,中国人.自认为很牛逼的人物,也是我的崇拜之神. 关于他本人的认知,希望大家读一下这篇关于他的文章,或许你会对语言,技术,产生浓厚的兴趣.https://mp ...
- Python开发【笔记】:sort排序大法
浅谈排序 程序中经常用到排序函数,Python 提供了 sort 和 sorted 函数,一个原地排序,一个返回排序后的新结果 1.参数 函数原型: sort([cmp[, key[, reverse ...
- Python开发【Django】:基础
Django基本配置 Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Se ...
- Flask wtform组件
Wtforms简介 WTForms是一个支持多个web框架的form组件 主要能够帮助我们生成html标签 对数据进行验证 安装 pip install wtforms Wtforms的使用 这里借助 ...
- CentOS7.5基础优化与常用配置
目录 最小化全新安装CentOS7基础优化 配置yum源 安装常用软件 关闭防火墙 关闭SELinux 优化ulimit 历史命令记录改为1万条 把命令提示符改为绿色 添加vim配置文件 添加一个普通 ...
- smart基础
主要是libs里面的smarty类,和init.inc.php配置文件 剩下的是php文件夹.模板文件夹,临时文件夹.缓存文件夹.配置文件夹.插件文件夹 调用main文件夹中的php文件,通过libs ...
- python webdriver 测试框架-数据驱动excel驱动的方式
简介: 数据驱动excel驱动方式,就是数据配置在excel里面,主程序调用的时候每次用从excel里取出的数据作为参数,进行操作, 需要掌握的地方是对excel的操作,要灵活的找到目标数据 测试数据 ...
- jQuery源码分析--Event模块(1)
jQuery的Event模块提供了强大的功能:事件代理,自定义事件,自定义数据等.今天记录一下它实现的原理. 我们都知道,在js的原生事件中,有事件对象和回调函数这两样东西.但是事件对象是只读的,所以 ...
- Android查缺补漏(IPC篇)-- 进程间通讯之AIDL详解
本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8436529.html 进程间通讯篇系列文章目录: Android查缺补漏(IP ...
- git仓库迁移的两种解决方案
Git仓库迁移而不丢失log的方法 要求能保留原先的commit记录,应该如何迁移呢? 同时,本地已经clone了原仓库,要配置成新的仓库地址,该如何修改呢? 注意:如果使用了代码审核工具Gerrit ...