MLE 求调
查看原帖
MLE 求调
1359837
Dream_Stars楼主2025/8/5 16:30

rt,数组开小 RE,开大一点就 MLE

# include <bits/stdc++.h>

# define ll int
// # define int int
# define rint register int
# define Ls (tr[now].ls)
# define Rs (tr[now].rs)
# define mid (l + r >> 1)

int read() {int s = 0 , w = 0; char c = getchar(); while (!isdigit(c)) w |= (c == '-') , c = getchar(); while (isdigit(c)) s = (s << 1) + (s << 3) + (c ^ 48) , c = getchar(); return w ? -s : s;}
void write(int x) {if (x < 0) putchar('-') , x = ~ (x - 1); if (x > 9) write(x / 10); putchar(x % 10 | 48);}
void writesp(int x) {write(x) , putchar(' '); }
void writeln(int x) {write(x) , putchar('\n');}

using namespace std;

constexpr int N = 1e5 + 10;
constexpr int X = 1e5;

struct node {
  int ls,rs;
  int sum;
  int kind;
};

struct ins {
  int nxt, to;
};

int n, m, cnt, ccnt;
int rt[N], dep[N], fa[N][20];
int head[N * 2], ans[N];
node tr[4000005];
ins b[N];

void debug () {
  cout << "qwq" << endl; 
  return ;
}

void add (int u, int v) {
  cnt ++;
  b[cnt].nxt = head[u];
  b[cnt].to = v;
  head[u] = cnt;
  return ;
}

void pre (int now, int fat) {
//  debug ();
  fa[now][0] = fat;
  dep[now] = dep[fat] + 1;
  for (rint i = 1; i < 20; i ++)
    fa[now][i] = fa[fa[now][i - 1]][i - 1];
  for (rint i = head[now]; i; i = b[i].nxt) {
    int v = b[i].to;
    if (v == fat) continue;
    pre (v, now);
  }
  return ;
}


int lca(int u, int v) {
//  debug ();
  if (dep[u] != dep[v]) {
  	if (dep[u] < dep[v]) swap (u, v);
  	for (rint i = 19; i >= 0; i --)
  	  if (dep[fa[u][i]] >= dep[v]) u = fa[u][i];
  }
  if (u == v) return u;
  for (rint i = 19; i >= 0; i --)
    if (fa[u][i] != fa[v][i])
      u = fa[u][i], v = fa[v][i];
  return fa[u][0];
}

void pushup(int now) {
  if (Ls == 0) {tr[now].sum = tr[Rs].sum, tr[now].kind = tr[Rs].kind; return ;}
  if (Rs == 0) {tr[now].sum = tr[Ls].sum, tr[now].kind = tr[Ls].kind; return ;}
  if (tr[Ls].sum >= tr[Rs].sum) {tr[now].sum = tr[Ls].sum, tr[now].kind = tr[Ls].kind;return ;}
  if (tr[Ls].sum <  tr[Rs].sum) {tr[now].sum = tr[Rs].sum, tr[now].kind = tr[Rs].kind;}
  return ;
}

void change (int &now, int l, int r, int v, int w) {
  if (now == 0) ccnt ++, now = ccnt;
  if (l == r) {
  	tr[now].sum = tr[now].sum + w;
  	tr[now].kind = v;
  	return ;
  }
  if (v <= mid) change (Ls, l, mid, v, w);
  else change (Rs, mid + 1, r, v, w);
  pushup(now);
  return ;
}

int merge (int u, int v, int l, int r) {
  if (u == 0 || v == 0) return u + v;
  if (l == r) {
  	tr[u].sum = tr[u].sum + tr[v].sum;
  	tr[u].kind = r;
  	return u;
  }
  tr[u].ls = merge (tr[u].ls, tr[v].ls, l, mid);
  tr[u].rs = merge (tr[u].rs, tr[v].rs, mid + 1, r);
  pushup (u);
  return u;
}

void solve (int u, int fat) {
  for (rint i = head[u]; i; i = b[i].nxt) {
    int v = b[i].to;
    if (v == fat) continue;
    solve (v, u);
    rt[u] = merge (rt[u], rt[v], 1, X);
  }
  if (tr[rt[u]].sum == 0) ans[u] = 0;
  else ans[u] = tr[rt[u]].kind;
}

signed main() {
  n = read (), m =read ();
  for (rint i = 1; i < n; i ++) {
  	int u = read ();
  	int v = read ();
  	add (u, v);
  	add (v, u);
  }
  pre (1, 0);
  while (m --) {
    int k = read (), ioi = read (), kd = read ();
    change (rt[k], 1, X, kd, 1);
    change (rt[ioi], 1, X, kd, 1);
    change (rt[lca(k, ioi)], 1, X, kd, -1);
    change (rt[fa[lca(k, ioi)][0]], 1, X, kd, -1);
  }
  solve (1, 0);
  for (rint i = 1; i <= n; i ++) writeln (ans[i]);
  return 0;
}
2025/8/5 16:30
加载中...