【三维偏序】【分块】bzoj3262 陌上花开
裸的三维偏序。 对x坐标排序,y、z坐标分块。复杂度O(n*sqrt(n*log(n)))。代码很短。
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
struct Point{int x,y,z,num;void Read(){scanf("%d%d%d",&x,&y,&z);}}p[];
bool operator < (const Point &a,const Point &b){return a.x<b.x;}
bool cmp (const Point &a,const Point &b){return a.y<b.y;}
vector<int>b[];
vector<Point>a[];
int n,rank[],m,head,maxv[],sum;
void makeblock()
{
int sz=(int)sqrt((double)n*(log((double)n)/log(2.0))); if(!sz) sz=;
for(sum=;sum*sz<n;sum++)
{
int R=sum*sz;
for(int i=(sum-)*sz+;i<=R;i++) p[i].num=sum;
maxv[sum]=p[R].y;
}
for(int i=(sum-)*sz+;i<=n;i++) p[i].num=sum;
maxv[sum]=p[n].y;
}
void insert(const Point &U)
{
b[U.num].insert(upper_bound(b[U.num].begin(),b[U.num].end(),U.z),U.z);
a[U.num].push_back(U);
}
int query(const Point &U)
{
int cnt=,i;
for(i=;i<=sum && maxv[i]<=U.y;++i)
cnt+=upper_bound(b[i].begin(),b[i].end(),U.z)-b[i].begin();
for(vector<Point>::iterator it=a[i].begin();it!=a[i].end();++it)
if((*it).z<=U.z&&(*it).y<=U.y) ++cnt;
return cnt;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) p[i].Read();
sort(p+,p+n+,cmp); makeblock();
sort(p+,p+n+);
for(int i=;i<=n;i++)
{
if(p[i].x!=p[i-].x) head=i;
if(p[i].x!=p[i+].x)
{
for(int j=head;j<=i;j++) insert(p[j]);
for(int j=head;j<=i;j++) ++rank[query(p[j])-];
}
}
for(int i=;i<n;i++) printf("%d\n",rank[i]);
return ;
}
【三维偏序】【分块】bzoj3262 陌上花开的更多相关文章
- BZOJ3262/洛谷P3810 陌上花开 分治 三维偏序 树状数组
原文链接http://www.cnblogs.com/zhouzhendong/p/8672131.html 题目传送门 - BZOJ3262 题目传送门 - 洛谷P3810 题意 有$n$个元素,第 ...
- BZOJ3262 陌上花开 —— 三维偏序 CDQ分治
题目链接:https://vjudge.net/problem/HYSBZ-3262 3262: 陌上花开 Time Limit: 20 Sec Memory Limit: 256 MBSubmit ...
- bzoj3262: 陌上花开 三维偏序cdq分治
三维偏序裸题,cdq分治时,左侧的x一定比右侧x小,然后分别按y排序,对于左侧元素按y大小把z依次插入到树状数组里,其中维护每个左侧元素对右侧元素的贡献,在bit查询即可 /************* ...
- BZOJ3262:陌上花开 & 洛谷3810:三维偏序——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=3262 https://www.luogu.org/problemnew/show/3810 Desc ...
- BZOJ3262陌上花开(三维偏序问题(CDQ分治+树状数组))+CDQ分治基本思想
emmmm我能怎么说呢 CDQ分治显然我没法写一篇完整的优秀的博客,因为我自己还不是很明白... 因为这玩意的思想实在是太短了: fateice如是说道: 如果说对于一道题目的离线操作,假设有n个操作 ...
- 洛谷P3810 陌上花开 CDQ分治(三维偏序)
好,这是一道三维偏序的模板题 当然没那么简单..... 首先谴责洛谷一下:可怜的陌上花开的题面被无情的消灭了: 这么好听的名字#(滑稽) 那么我们看了题面后就发现:这就是一个三维偏序.只不过ans不加 ...
- P3810 -三维偏序(陌上花开)cdq-分治
P3810 [模板]三维偏序(陌上花开) 思路 :按照 1维排序 二维 分治三维树状数组维护 #include<bits/stdc++.h> using namespace std; #d ...
- P3810 【模板】三维偏序(陌上花开)
P3810 [模板]三维偏序(陌上花开) cdq分治+树状数组 三维偏序模板题 前两维用cdq分治,第三维用树状数组进行维护 就像用树状数组搞逆序对那样做--->存权值的出现次数 attenti ...
- Luogu 3810 & BZOJ 3262 陌上花开/三维偏序 | CDQ分治
Luogu 3810 & BZOJ 3263 陌上花开/三维偏序 | CDQ分治 题面 \(n\)个元素,每个元素有三个值:\(a_i\), \(b_i\) 和 \(c_i\).定义一个元素的 ...
随机推荐
- 《vue.js实战》练习---数字输入框组件
html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- 拉格朗日乘数法 和 KTT条件
预备知识 令 \(X\) 表示一个变量组(向量) \((x_1, x_2, \cdots, x_n)\) 考虑一个处处可导的函数 \(f(X)\), 为了方便描述, 这里以二元函数为例 对于微分, 考 ...
- JAVA中List<Long> 转long[]的方法
之前每次都是通过循环去写,感觉代码不够优雅,百度了一下,查到如下的写法,先记下来: List<Long> list = new ArrayList<Long>(); list. ...
- JVM内存模型 二
在并发编程中,多个线程之间采取什么机制进行通信(信息交换),什么机制进行数据的同步? 在Java语言中,采用的是共享内存模型来实现多线程之间的信息交换和数据同步的. 线程之间通过共享程序公共的状态,通 ...
- idea 将工程项目打包成war
1.File--Project structure ---- Artifacts ----- + -----web Application :Archive ---for ' **:war explo ...
- HDU4889 Scary Path Finding Algorithm
Fackyyj loves the challenge phase in TwosigmaCrap(TC). One day, he meet a task asking him to find sh ...
- KMP算法_模板_C++
这个博客讲得非常优秀,可惜它是Java版本的 http://blog.csdn.net/yutianzuijin/article/details/11954939/ a 为匹配串,b 为目标串 通俗讲 ...
- opencv_人脸检测、模型训练、人脸识别
人脸检测.模型训练.人脸识别 2018-08-15 今天给大家带来一套人脸识别一个小案例,主要是帮助小伙伴们解决如何入门OpenCV人脸识别的问题,现在的AI行业比较火热,AI技术的使用比较广泛.就拿 ...
- django原生sql
参考:http://www.jb51.net/article/128257.htm coding=utf-8 from django.core.paginator import Paginator d ...
- 转:Python网页解析:BeautifulSoup vs lxml.html
转自:http://www.cnblogs.com/rzhang/archive/2011/12/29/python-html-parsing.html Python里常用的网页解析库有Beautif ...