社区讨论
用不同的编译器提交一个RE一个A
P3605[USACO17JAN] Promotion Counting P参与者 5已保存回复 6
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 6 条
- 当前快照
- 1 份
- 快照标识符
- @lo8a22ff
- 此快照首次捕获于
- 2023/10/27 15:14 2 年前
- 此快照最后确认于
- 2023/10/27 15:14 2 年前
C++ 14 GCC(9): https://www.luogu.com.cn/record/83936628
C++ 14:https://www.luogu.com.cn/record/83936781
代码都是一样的:
CPP#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100005;
int n;
int ans[MAXN], p[MAXN], p2[MAXN], fa[MAXN], rt[MAXN << 5], lc[MAXN << 5],
rc[MAXN << 5], tree[MAXN << 5], tot;
vector<int> g[MAXN];
void build(int &rt, int l, int r, int p) {
rt = ++tot;
tree[rt] = 1;
if (l == r) return;
int m = (l + r) >> 1;
if (p <= m)
build(lc[rt], l, m, p);
else
build(rc[rt], m + 1, r, p);
}
int merge(int rt, int pr, int l, int r) {
if (!rt || !pr) return rt ^ pr;
if (l == r) {
tree[rt] += tree[pr];
return rt;
}
int m = (l + r) >> 1;
lc[rt] = merge(lc[rt], lc[pr], l, m);
rc[rt] = merge(rc[rt], rc[pr], m + 1, r);
tree[rt] = tree[lc[rt]] + tree[rc[rt]];
}
int query(int rt, int l, int r, int p) {
if (l == r) return tree[rt] * (l > p);
int m = (l + r) >> 1;
if (p > m) return query(rc[rt], m + 1, r, p);
return query(lc[rt], l, m, p) + tree[rc[rt]];
}
void dfs(int r) {
for (int i = 0; i < g[r].size(); i++) {
dfs(g[r][i]);
rt[r] = merge(rt[r], rt[g[r][i]], 1, n);
}
ans[r] = query(rt[r], 1, n, p[r]);
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> p[i];
p2[i] = p[i];
}
// 离散化
sort(p2 + 1, p2 + 1 + n);
for (int i = 1; i <= n; i++) {
p[i] = lower_bound(p2 + 1, p2 + 1 + n, p[i]) - p2;
build(rt[i], 1, n, p[i]);
}
for (int i = 2; i <= n; i++) {
cin >> fa[i];
g[fa[i]].push_back(i);
}
dfs(1);
for (int i = 1; i <= n; i++) { cout << ans[i] << endl; }
return 0;
}
回复
共 6 条回复,欢迎继续交流。
正在加载回复...