【三维偏序】【分块】bzoj3262 陌上花开

裸的三维偏序。 对x坐标排序,y、z坐标分块。复杂度O(n*sqrt(n*log(n)))。代码很短。

 1 #include<cstdio>
 2 #include<cmath>
 3 #include<algorithm>
 4 #include<vector>
 5 using namespace std;
 6 struct Point{int x,y,z,num;void Read(){scanf("%d%d%d",&x,&y,&z);}}p[100002];
 7 bool operator < (const Point &a,const Point &b){return a.x<b.x;}
 8 bool cmp (const Point &a,const Point &b){return a.y<b.y;}
 9 vector<int>b[400];
10 vector<Point>a[400];
11 int n,rank[100001],m,head,maxv[400],sum;
12 void makeblock()
13 {
14     int sz=(int)sqrt((double)n*(log((double)n)/log(2.0))); if(!sz) sz=1;
15     for(sum=1;sum*sz<n;sum++)
16       {
17         int R=sum*sz;
18         for(int i=(sum-1)*sz+1;i<=R;i++) p[i].num=sum;
19         maxv[sum]=p[R].y;
20       }
21     for(int i=(sum-1)*sz+1;i<=n;i++) p[i].num=sum;
22     maxv[sum]=p[n].y;
23 }
24 void insert(const Point &U)
25 {
26     b[U.num].insert(upper_bound(b[U.num].begin(),b[U.num].end(),U.z),U.z);
27     a[U.num].push_back(U);
28 }
29 int query(const Point &U)
30 {
31     int cnt=0,i;
32     for(i=1;i<=sum && maxv[i]<=U.y;++i)
33       cnt+=upper_bound(b[i].begin(),b[i].end(),U.z)-b[i].begin();
34     for(vector<Point>::iterator it=a[i].begin();it!=a[i].end();++it)
35       if((*it).z<=U.z&&(*it).y<=U.y) ++cnt;
36     return cnt;
37 }
38 int main()
39 {
40     scanf("%d%d",&n,&m);
41     for(int i=1;i<=n;i++) p[i].Read();
42     sort(p+1,p+n+1,cmp); makeblock();
43     sort(p+1,p+n+1);
44     for(int i=1;i<=n;i++)
45       {
46           if(p[i].x!=p[i-1].x) head=i;
47         if(p[i].x!=p[i+1].x)
48           {
49               for(int j=head;j<=i;j++) insert(p[j]);
50               for(int j=head;j<=i;j++) ++rank[query(p[j])-1];
51           }
52       }
53     for(int i=0;i<n;i++) printf("%d\n",rank[i]);
54     return 0;
55 }
时间: 2024-12-26 06:06:35

【三维偏序】【分块】bzoj3262 陌上花开的相关文章

BZOJ3262/洛谷P3810 陌上花开 CDQ分治 三维偏序 树状数组

原文链接http://www.cnblogs.com/zhouzhendong/p/8672131.html 题目传送门 - BZOJ3262 题目传送门 - 落谷P3810 题意 有$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$的数量. $n\leq 100000,max\{a_i,b_i,c_i|i

P2433 - 【BZOJ 3262三维偏序】陌上花开------三维偏序

P2433 - [BZOJ 3262三维偏序]陌上花开 Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量. 定义一朵花A比另一朵花B要美丽,当且仅当Sa>=Sb,Ca>=Cb,Ma>=Mb.显然,两朵花可能有同样的属性.需要统计出评出每个等级的花的数量. Input 第一行为N,K (1 <= N <= 100,000, 1 <= K <= 200,

三维偏序(陌上花开)

三维偏序(陌上花开) 有n个元素,第i个元素有\(a_i\),\(b_i\),\(c_i\)三个属性,设\(f(i)\)表示满足\(a_j\le a_i\)且\(b_j\le b_i\)且\(c_j\le c_i\)的j的数量.对于\(d\in[0, n)\),求\(f(i)=d\)的数量. 偏序关系,意思是并不是任意两个元素之间都有关系.以前在机房里天天听到"偏序""cdq",也知道偏序问题要用cdq分治来做.现在终于会辣! 显然,我们处理的是三元组之间的关系,并

P3810 【模板】三维偏序(陌上花开)

题目背景 这是一道模板题 可以使用bitset,CDQ分治,K-DTree等方式解决. 题目描述 有 nn 个元素,第 ii 个元素有 a_iai?.b_ibi?.c_ici? 三个属性,设 f(i)f(i) 表示满足 a_j \leq a_iaj?≤ai? 且 b_j \leq b_ibj?≤bi? 且 c_j \leq c_icj?≤ci? 的 jj 的数量. 对于 d \in [0, n)d∈[0,n),求 f(i) = df(i)=d 的数量 输入输出格式 输入格式: 第一行两个整数 n

P3810 -三维偏序(陌上花开)cdq-分治

P3810 [模板]三维偏序(陌上花开) 思路 :按照 1维排序 二维 分治三维树状数组维护 #include<bits/stdc++.h> using namespace std; #define maxn 234567 int n,k,id,s,tree[maxn*2],tong[maxn]; struct node { int a,b,c,ans,w; node() { ans=0; w=0; } } data[maxn]; bool cp1(node x,node y) { if(x.

BZOJ 3262: 陌上花开 [CDQ分治 三维偏序]

Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当且仅当Sa>=Sb,Ca>=Cb,Ma>=Mb.显然,两朵花可能有同样的属性.需要统计出评出每个等级的花的数量. Input 第一行为N,K (1 <= N <= 100,000, 1 <= K <= 200,000 ), 分别表示花的数量和最大属性值. 以下N行,每

题解-luogu P3810三维偏序(陌上花开)

\(\rm三维偏序\) \(\rm一.定义:序列上每个点有三个权值~(x,y,z)~,求有多少个点对~(a,b)~同时满足~a_x \le b_x~,~a_y \le b_y~,~a_z \le b_z~\) \(\rm二.解法:~cdq~分治\) \(\rm\qquad首先,我们思考一下二维偏序的解法\) \(\rm\qquad\qquad我们先对整个序列按照~x~排一遍序,那么我们就已经解决了一个维度\) \(\rm\qquad\qquad即目前序列中所有后面的点的~x~值一定比前面的点小\

HDU 5618:Jam&#39;s problem again(CDQ分治+树状数组处理三维偏序)

http://acm.hdu.edu.cn/showproblem.php?pid=5618 题意:-- 思路:和NEUOJ那题一样的.重新写了遍理解了一下,算作处理三维偏序的模板了. 1 #include <cstdio> 2 #include <algorithm> 3 #include <iostream> 4 #include <cstring> 5 using namespace std; 6 #define INF 0x3f3f3f3f 7 #d

SPOJ LIS2 Another Longest Increasing Subsequence Problem 三维偏序最长链 CDQ分治

Another Longest Increasing Subsequence Problem Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=19929 Description Given a sequence of N pairs of integers, find the length of the longest incre