1. 程式人生 > >P3810 【模板】三維偏序(陌上花開)

P3810 【模板】三維偏序(陌上花開)

模板題 eset ans turn res vid ios 一道 模板

題目背景

這是一道模板題

可以使用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 的數量

輸入輸出格式

輸入格式:

第一行兩個整數 nn、kk,分別表示元素數量和最大屬性值。

之後 nn 行,每行三個整數 a_iai?b_ibi?c_ici?,分別表示三個屬性值。

輸出格式:

輸出 nn 行,第 d + 1d+1 行表示 f(i) = df(i)=d 的 ii 的數量。

輸入輸出樣例

輸入樣例#1: 復制
10 3
3 3 3
2 3 3
2 3 1
3 1 1
3 1 2
1 3 1
1 1 2
1 2 2
1 3 2
1 2 1
輸出樣例#1: 復制
3
1
3
0
1
0
1
0
0
1

說明

1 \leq n \leq 100000, 1 \leq k \leq 2000001n100000,1k200000

//Pro:P3810 【模板】三維偏序(陌上花開)

#include<iostream>
#include<cstdio>
#include
<cmath> #include<cstring> #include<algorithm> using namespace std; inline int read() { char c=getchar();int num=0; for(;!isdigit(c);c=getchar()); for(;isdigit(c);c=getchar()) num=num*10+c-0; return num; } const int N=1e5+5; int n,k; struct THI { int a,b,c,w,ans; }thi[N],ele[N];
int m; bool cmp1(THI A,THI B) { return A.a==B.a?(A.b==B.b?A.c<B.c:A.b<B.b):A.a<B.a; } bool cmp2(THI A,THI B) { return A.b==B.b?A.c<B.c:A.b<B.b; } #define lowbit(x) x&(-x) int bit[N<<1],bound; inline void add(int x,int val) { for(;x<=k;x+=lowbit(x)) bit[x]+=val; } inline int query(int x) { int res=0; for(;x;x-=lowbit(x)) res+=bit[x]; return res; } void divide(int l,int r) { if(l>=r) return; int mid=(l+r)>>1; divide(l,mid),divide(mid+1,r); sort(ele+l,ele+mid+1,cmp2); sort(ele+mid+1,ele+r+1,cmp2); int i=l,j=mid+1; for(;j<=r;++j) { while(ele[i].b<=ele[j].b&&i<=mid) add(ele[i].c,ele[i].w),++i; ele[j].ans+=query(ele[j].c); } for(j=l;j<i;++j) add(ele[j].c,-ele[j].w); } int ans[N]; int main() { n=read(),k=read(); for(int i=1;i<=n;++i) thi[i].a=read(),thi[i].b=read(),thi[i].c=read(); sort(thi+1,thi+n+1,cmp1); for(int i=1,cnt=0;i<=n;++i) { ++cnt; if(thi[i].a!=thi[i+1].a||thi[i].b!=thi[i+1].b||thi[i].c!=thi[i+1].c) { ele[++m]=thi[i]; ele[m].w=cnt, cnt=0; } } divide(1,m); for(int i=1;i<=m;++i) ans[ele[i].ans+ele[i].w-1]+=ele[i].w; for(int i=0;i<n;++i) printf("%d\n",ans[i]); return 0; }

P3810 【模板】三維偏序(陌上花開)