社区讨论

用不同的编译器提交一个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 条回复,欢迎继续交流。

正在加载回复...