boolf0(vector<int> &a, int m, int k){ int s = 0; for (int i = 0, j = 0; i < a.size(); i++) { while (a[i] - a[j] > m) j++; s += i - j; } return s >= k; }
intf(vector<int> &a, int k){ sort(a.begin(), a.end());
int g = 0; int h = a.back() - a[0]; while (g < h) { int m = g + (h - g) / 2; if (f0(a, m, k)) { h = m; } else { g = m + 1; } }
return g; }
intmain(){ int n, k; cin >> n >> k; vector<int> a(n, 0); for (int i = 0; i < n; i++) { cin >> a[i]; } cout << f(a, k) << endl; return0; }
假设输入总是合法的且 ,完成下面的判断题和单选题:
判断题
将第 24 行的 m 改为 m - 1,输出有可能不变,而剩下情况为少 1 。()
解析:
这道题很难评,包的啊哥哥,又是送分题,判对
将第 22 行的 g + (h - g) / 2 改为 (h + g) >> 1,输出不变。()
解析:
又是送分题,,,,判对
当输入为 5 7 2 -4 5 1 -3,输出为 5。()
解析:
模拟即可,判对
单选题
设 数组中最大值减最小值加 为 ,则 f 函数的时间复杂度为()。
解析:
排序是 二分是 两个加起来就是 选项C
将第 10 行中的 > 替换为 >=,那么原输出与现输出的大小关系为()。
解析:
替换后在 m 一定时,s 可能不变或变得更大,而变得更大可能会让本来的 false 变成 true ,使答案变得更小。
int n, m, deg[MAXN]; std::vector<int> E[MAXN]; longlong k, f[MAXN];
intnext(std::vector<int> cand, longlong &k){ std::sort(cand.begin(), cand.end()); for (int u : cand) { if (①) return u; k -= f[u]; } return-1; }
intmain(){ std::cin >> n >> m >> k; for (int i = 0; i < m; ++i) { int u, v; std::cin >> u >> v; // 一条从u到v的边 E[u].push_back(v); ++deg[v]; } std::vector<int> Q; for (int i = 0; i < n; ++i) if (!deg[i]) Q.push_back(i); for (int i = 0; i < n; ++i) { int u = Q[i]; for (int v : E[u]) { if (②) Q.push_back(v); --deg[v]; } } std::reverse(Q.begin(), Q.end()); for (int u : Q) { f[u] = 1; for (int v : E[u]) f[u] = ③; } int u = next(Q, k); std::cout << u << std::endl; while (④) { ⑤; u = next(E[u], k); std::cout << u << std::endl; } return0; }
解析:
f[u] 表示以 u 为起点的路径数,k 表示要求的路径第 k 小,此处若 k<=f[u] 则说明要求的路径经过顶点 u。
voidsolve(int l, int r){ if (l + 1 == r) { ans += a[l]; return; } int mid = (l + r) >> 1; std::vector<int> pre(a + mid, a + r); for (int i = 1; i < r - mid; ++i) ①; std::vector<longlong> sum(r - mid + 1); for (int i = 0; i < r - mid; ++i) sum[i + 1] = sum[i] + pre[i]; for (int i = mid - 1, j = mid, max = 0; i >= l; --i) { while (j < r && ②) ++j; max = std::max(max, a[i]); ans += ③; ans += ④; } solve(l, mid); solve(mid, r); }
intmain(){ std::cin >> n; for (int i = 0; i < n; ++i) std::cin >> a[i]; ⑤; std::cout << ans << std::endl; return0; }