用不同的编译器提交一个RE一个A
查看原帖
用不同的编译器提交一个RE一个A
93259
Zirnc楼主2022/8/15 22:09

C++ 14 GCC(9): https://www.luogu.com.cn/record/83936628

C++ 14:https://www.luogu.com.cn/record/83936781

代码都是一样的:

#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;
}
2022/8/15 22:09
加载中...