這是一道模板題
可以使用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 33 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: 複製
3130101
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分治 先三關鍵字排序 然後把第二關鍵字歸併排序 在合併子區間時用 第三關鍵字的權值樹狀樹組 算出子區間的答案 為什麼可以這樣搞呢 首先第一維已經有序 所以只要考慮左邊對右邊的影響 把第二維歸併時 左子區間的第一二關鍵字 全部小於或等於 右子區間的第一二關鍵字 所以也只要考慮左邊對右邊的...