求助80TLE
查看原帖
求助80TLE
530349
天空即为极限楼主2023/1/14 20:13
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N = 2e5 + 5;

struct node {
  int l, r, val;
}k[N * 22]; 

int n, cnt, tot, rt; 

int dfs () {
  int a, x; cin >> a; k[x = ++ tot].val = a;
  if (a != 0) cnt ++;
  else { k[x].l = dfs (); k[x].r = dfs (); } 
  return x;
}

void OutPut (int x) {
  if (!x) return;
  cout << k[x].val << "\n";
  OutPut (k[x].l); OutPut (k[x].r);
}

struct point {
  int l, r, val;
}t[N * 10];
int root[N * 10], num;

inline void pushup (int cur) {
  t[cur].val = t[t[cur].l].val + t[t[cur].r].val;
}

void insert (int &cur, int l, int r, int x, int val) {
  if (!cur) cur = ++ num;
  if (l == r) return t[cur].val += val, void(); 
  int mid = l + r >> 1;
  if (x <= mid) insert (t[cur].l, l, mid, x, val);
  else insert (t[cur].r, mid + 1, r, x, val);
  pushup (cur);
}

int Delta = 0, Ans, Delta2;

void merge (int &cur, int cur2, int l, int r) {
  if (!cur or !cur2) return cur = cur + cur2, void ();
  if (l == r) return t[cur].val += t[cur2].val, void();
  int mid = l + r >> 1;
  Delta += t[t[cur].l].val * t[t[cur2].r].val;
  Delta2 += t[t[cur].r].val * t[t[cur2].l].val; 
  merge (t[cur].l, t[cur2].l, l, mid); merge (t[cur].r, t[cur2].r, mid + 1, r);
  pushup (cur);
}

void DFS (int x) {
  if (k[x].val != 0) return insert (root[x], 1, n, k[x].val, 1), void ();
  DFS (k[x].l), DFS (k[x].r);
  Delta2 = Delta = 0;
  merge (root[k[x].l], root[k[x].r], 1, n);
  root[x] = root[k[x].l];
  Ans += min (Delta, Delta2);
}

signed main () {
  ios::sync_with_stdio(false);
  cin.tie(0), cout.tie(0);
	cin >> n;
	rt = dfs ();
	DFS (rt);
	cout << Ans << "\n";
} 
2023/1/14 20:13
加载中...