2018-10-18考试

这里是简介

T1

题面

这是一道基础分治练习题。
给你三个数列${a_i}, {b_i}, {c_i},$保证每个数列都恰好是一个排列。你需要求出满足$a_i < a_j , b_i <
b_j , c_i < c_j$的有序对$(i, j)$ 的数目。

题解

一眼三维偏序模板,于是就打了暴力CDQ爆44…

不过这个题和普通的三维偏序模板有一些区别。

三个数列都是排列!

我们考虑计算下面三个东西。
$$
X = \sum_{i, j}[a_i < a_j][b_i < b_j] \
Y = \sum_{i, j}[b_i < b_j][c_i < c_j] \
Z = \sum_{i, j}[a_i < a_j][c_i < c_j]
$$
对于一对需要算答案的点对$(i, j),$它一定在$X, Y, Z$中都被算过一遍。对于不需要算答案的点对,它一定恰好在$X, Y, Z$中的一个里面被计算过一次。
$$
\therefore Ans = \frac{X+Y+Z-\binom{n}{2}}{2}
$$

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include<cstdio>
#include<algorithm>
#define RG register

const int maxn(2e6 + 10);
unsigned int SA, SB, SC;
int n, a[maxn], b[maxn], c[maxn], C1[maxn], C2[maxn], C3[maxn];
long long ans;

struct qry { int a, b, c; } q[maxn];
inline void swap(int &x, int &y) { static int t; t = x; x = y; y = t; }
inline unsigned int Random()
{
SA ^= SA << 16; SA ^= SA >> 5; SA ^= SA << 1;
static unsigned int t; t = SA; SA = SB; SB = SC; SC ^= t ^ SA;
return SC;
}

inline void add(int *C, int x) { while(x <= n) ++C[x], x += x & -x; }
inline int query(int *C, int x) { int ans = 0; while(x) ans += C[x], x -= x & -x; return ans; }

int main()
{
RG int i;
scanf("%d%u%u%u", &n, &SA, &SB, &SC);
for(i = 1; i <= n; ++i) a[i] = i;
for(i = 1; i <= n; ++i) b[i] = i;
for(i = 1; i <= n; ++i) c[i] = i;
for(i = 1; i <= n; ++i) swap(a[i], a[1 + Random() % n]);
for(i = 1; i <= n; ++i) swap(b[i], b[1 + Random() % n]);
for(i = 1; i <= n; ++i) swap(c[i], c[1 + Random() % n]);
for(i = 1; i <= n; ++i) q[a[i]] = (qry) {a[i], b[i], c[i]};
for(i = 1; i <= n; ++i) ans += query(C1, q[i].b), add(C1, q[i].b);
for(i = 1; i <= n; ++i) q[b[i]] = (qry) {a[i], b[i], c[i]};
for(i = 1; i <= n; ++i) ans += query(C2, q[i].c), add(C2, q[i].c);
for(i = 1; i <= n; ++i) q[c[i]] = (qry) {a[i], b[i], c[i]};
for(i = 1; i <= n; ++i) ans += query(C3, q[i].a), add(C3, q[i].a);
printf("%lld\n", (ans - 1ll * n * (n - 1) / 2) >> 1);
return 0;
}

T2

太恶心,不写了

T3

太毒瘤,不写了

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×