解题思路:树状数组+离散化
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <cmath> #include <map> #include <set> #include <stack> #include <queue> #include <vector> #include <bitset> #include <functional> using namespace std; #define LL long long const int INF = 0x3f3f3f3f; int vis[100005 * 2],n; LL a[100005 * 2], b[100005 * 2], ans, k, xx[100005 * 2]; vector<int>g[100005]; LL lowbit(LL x) { return x&(-x); } void add(LL x, int val) { while (x <= 2 * n) { xx[x] += val; x += lowbit(x); } } LL getsum(LL x) { LL sum = 0; while (x>0) { sum += xx[x]; x -= lowbit(x); } return sum; } void dfs(int s) { int Size = g[s].size(); LL sum = getsum(a[n + s]); ans += sum; add(a[s], 1); for (int i = 0; i<Size; i++) { int v = g[s][i]; dfs(v); } add(a[s], -1); } int main() { int t; scanf("%d", &t); while (t--) { ans = 0; memset(vis, 0, sizeof(vis)); memset(xx, 0, sizeof(xx)); for (int i = 0; i <= n; i++) g[i].clear(); scanf("%d%lld", &n, &k); int u, v; for (int i = 1; i <= n; i++) { scanf("%lld", &a[i]); a[i + n] = k / a[i]; b[i] = a[i], b[i + n] = a[i + n]; } sort(b + 1, b + 2 * n + 1); int m = unique(b + 1, b + 2 * n + 1) - b; for (int i = 1; i <= 2 * n; i++) a[i] = lower_bound(b + 1, b + m + 1, a[i]) - b; for (int i = 0; i<n - 1; i++) { scanf("%d%d", &u, &v); g[u].push_back(v); vis[v]++; } int s; for (int i = 1; i <= n; i++) if (vis[i] == 0) { s = i; break; } dfs(s); printf("%lld\n", ans); } return 0; }