三維偏序 陌上花開

2022-09-12 10:42:16 字數 1547 閱讀 4611

有\(n\)個元素,每個元素有三個屬性:\(a_i\),\(b_i\),\(c_i\)

定義\(f[i]\)為滿足\(a_j < a_i\) 且 \(b_j < b_i\) 且 \(c_j < c_ i\)的\(j\)的個數

\(ans[i] = \sum_^ f[j] = i\)

求所有的\(ans[i]\);

陌上花開,心憂梓桑。

\(cdq\)分治模板題

首先以\(a\)為關鍵字排序,省略一維

再以\(b\)為關鍵字用類似於歸併排序求逆序對的方法進行歸併

最後用樹狀陣列統計\(c\)這一維

簡單來說就是歸併排序套樹狀陣列。

有點像點分治?

調了不知道多久,最後發現樹狀陣列範圍打錯了(原地**.jpg)

#include using namespace std;

#define debug(...) fprintf(stderr, __va_args__)

#define mp make_pair

#define fst first

#define snd second

templateinline bool chkmin(t &a, const t &b)

templateinline bool chkmax(t &a, const t &b)

inline int read()

typedef long long ll;

typedef pairpii;

const int maxn = 2e5 + 10;

vector g[maxn];

map map;

struct node

}p[maxn], tmp[maxn];

int cnt, f[maxn], val[maxn], top, num, ans[maxn], k, v[maxn];

pii del[maxn];

bool ok;

namespace bit

int tre[maxn];

inline void modify(int pos, int v)

inline int query(int pos)

return sum; }}

void cdq_div(int l, int r)

else

} while(r <= r)

sort(p + l, p + r + 1);

while(top)

}int id[maxn];

int main()

for (int i = 1; i <= k; ++i)

map.clear();

} cdq_div(1, cnt);

for (int i = 1; i <= cnt; ++i) ans[f[p[i].id] + p[i].val - 1] += p[i].val;

for (int i = 0; i < n; ++i) printf("%d\n", ans[i]);

return 0;

}

三維偏序(陌上花開)

這是一道模板題 可以使用bitset,cdq分治,k dtree等方式解決。有 n個元素,第 i個元素有 ai bi ci 三個屬性,設 f i 表示滿足 aj ai 且 bj bi 且 cj ci 的 j 的數量。對於 d 0,n 求 f i d 的數量 輸入格式 第一行兩個整數 n k,分別表示...

陌上花開(三維偏序)(cdq分治)

其實就是三位偏序的模板,cdq分治入門題。學習cdq分治請看 stdcall大佬的部落格 傳送門 排序來維護第一層,cdq維護一層,樹狀陣列維護一層,然後就沒有啦qwqwq include include include include include define maxn 100010 usin...

Luogu3810 三維偏序(陌上花開)

題目背景 這是一道模板題 可以使用bitset,cdq分治,k dtree等方式解決。題目描述有 n n 個元素,第 i role presentation style position relative i i個元素有ai a i bi b i ci c i三個屬性,設f i f i 表示滿足aj...