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