二維三維偏序

2021-09-28 15:27:21 字數 1738 閱讀 5254

一維偏序::就是排序,

二維偏序:排序+樹狀陣列:

例題:給定 n 個點(x,y),定義每個點的等級是在該點左下方(含正左、正下)的點的數目,試統計每個等級有多少個點。

題目鏈結

分析:對於二維偏序:對1維x進行排序,那麼在右邊的點不會對左邊的點有貢獻。然後對y建立樹狀陣列。計算0-y的和,就是sum[y];

#include

using namespace std;

const

int maxn=

3.2*

10005

;struct node

a[maxn]

;int c[maxn]

;int n,cnt[maxn]

;int maxv=0;

intcmp

(node x,node y)

intlowbit

(int x)

void

add(

int x,

int val)

}int

sum(

int x)

return s;

}int

main()

sort

(a+1

,a+1

+n,cmp)

;for

(int i=

1;i<=n;i++

)for

(int i=

0;i) cout<

}

三維偏序

首先對一維x進行排序,還是右邊的值對左邊的值沒有貢獻,在x是排序好的基礎上,將n分為兩半,那麼左邊中y小的一定對右邊裡y大的有貢獻,然後用樹狀陣列來計算累計。

#include

using namespace std;

int _n,k;

const

int maxn=

200005

;struct node

a[maxn]

,b[maxn]

;int n;

int c[maxn]

;int ans[maxn]

;int

cmp(node x,node y)

intcmp1

(node x,node y)

intlowbit

(int x)

void

add(

int x,

int val)

}int

sum(

int x)

return s;

}void

solve

(int l,

int r)

for(i=l;iintmain()

solve(1

,n);

for(

int i=

1;i<=n;i++

) ans[a[i]

.ans+a[i]

.w-1]+

=a[i]

.w;//為什麼再加一遍呢,a[i]--和b[i]不是一一對應的,a中是將重複的合併了。

for(

int i=

0;i<_n;i++

) cout<

}

三維偏序 cdq

luogu 3810 就是將逆序對轉化到了三維上去 原理等我寒假再補 第一維sort解決 第二維並歸排序 cdq 解決 第三維樹狀陣列 luogu judger enable o2 include include include include using std sort const int ma...

HDU 5517 三維偏序 二維樹狀陣列

題意 已知a集合 a,b b集合 c,d,e c a b a,c,d 在b和e相等的情況下才可以,問題是求出c中有幾個元素,該元素除了自己沒有比他大的,的定義是當 a a b b c c 時,才成立。思路 三位偏序cdq可以解決,但是如果抓住c,d的範圍是1000的話,可以直接用二維樹狀陣列代替。由...

二維偏序問題

想學cdq分治,然而cdq的經典題目是三維偏序問題,是建立在二維偏序問題的基礎上的。我這只蒟蒻連個二維偏序問題都沒做過。在網上找了一大圈,才勉強找到乙個二維偏序的題目。bzoj的許可權啊。是時候買個許可權號了。題目鏈結 這個牛客網也不知道是什麼鬼。給你n個物品,每個物品有兩個參量,分別為 s,w 讓...