#include<bits/stdc++.h> usingnamespace std; #define ll long long constint N = 1e6 + 10; constint INF = 0x3f3f3f3f; int T; int n, a[N], b[N], c[3]; int sum2[N], sum1[N]; map<int, int>mp; intmain(){ cin >> T; while (T--) { scanf("%d", &n); mp.clear(); c[1] = c[2] = 0; fill(a, a + 2 * n + 1, 0); for (int i = 1; i <= n; i++)scanf("%d", &a[i]), c[a[i]]++; for (int i = 1; i <= n; i++)scanf("%d", &b[i]), c[b[i]]++; reverse(a + 1, a + n + 1); mp[0] = 0; for (int i = 1; i <= n; i++) { sum2[i] = sum2[i - 1] + (b[i] == 1 ? 1 : -1); if(!mp.count(sum2[i]))mp[sum2[i]] = i; sum1[i] = sum1[i - 1] + (a[i] == 1 ? 1 : -1);
} int nd = c[1] - c[2]; int ans = INF; for (int i = 0; i <= n; i++) { if (!mp.count(nd - sum1[i]))continue; ans = min(ans, i + mp[nd - sum1[i]]); } printf("%d\n", ans); } return0; }
D. Segment Tree
题意:给定几个区间,连边当且仅当两区间相交(不能包含),问图是否是树。
考虑树的特点:无环,连通,n-1条边。
最后一点是本题关键如果两两连边的话,复杂度是 n2,显然不太行,但是知道了边数最多是 n-1,复杂度就最大是 n 了。
#include<bits/stdc++.h> usingnamespace std; #define ll long long constint N = 5e5 + 10; constint INF = 0x3f3f3f3f; int n; int l[N], r[N], tot; vector<int>G[N]; voiddfs(int u, int _fa){ for (int v : G[u]) { if (v == _fa)continue; l[v] = ++tot; } r[u] = ++tot; for (int i = (int)G[u].size() - 1; i >= 0; i--) { int v = G[u][i]; if (v == _fa)continue; dfs(v, u); } } intmain(){ scanf("%d", &n); for (int i = 1; i < n; i++) { int u, v; scanf("%d%d", &u, &v); G[u].push_back(v); G[v].push_back(u); } l[1] = ++tot; dfs(1, 0); for (int i = 1; i <= n; i++)printf("%d %d\n", l[i], r[i]); return0; }