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

2022-05-03 12:57:18 字數 1585 閱讀 3954

這是一道模板題

可以使用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: 複製

313

0101

001

1 \leq n \leq 100000, 1 \leq k \leq 2000001≤n≤100000,1≤k≤200000

//

pro:p3810 【模板】三維偏序(陌上花開)

#include

#include

#include

#include

#include

using

namespace

std;

inline

intread()

const

int n=1e5+5

;int

n,k;

struct

thithi[n],ele[n];

intm;

bool

cmp1(thi a,thi b)

bool

cmp2(thi a,thi b)

#define lowbit(x) x&(-x)

int bit[n<<1

],bound;

inline

void add(int x,int

val)

inline

int query(int

x)void divide(int l,int

r)

for(j=l;jj)

add(ele[j].c,-ele[j].w);

}int

ans[n];

intmain()

}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;ii)

printf(

"%d\n

",ans[i]);

return0;

}

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

傳送門 洛谷 哇塞大佬好厲害 據說正解是一維排序,二維cdq,三維樹狀陣列的 然而大佬硬是二維三維都用了cdq 而且莫名好寫 太暴力了 1 minamoto 2 include3 include4 include5 using std sort 6 define getc p1 p2 p2 p1 b...

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

有 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 ...

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

傳送門 cdq分治 先三關鍵字排序 然後把第二關鍵字歸併排序 在合併子區間時用 第三關鍵字的權值樹狀樹組 算出子區間的答案 為什麼可以這樣搞呢 首先第一維已經有序 所以只要考慮左邊對右邊的影響 把第二維歸併時 左子區間的第一二關鍵字 全部小於或等於 右子區間的第一二關鍵字 所以也只要考慮左邊對右邊的...