关于倍增优化的一点小问题
查看原帖
关于倍增优化的一点小问题
708102
bijhla楼主2023/11/23 20:04

这两份代码只有dfs部分不同

一个将倍增放在for里面,一个是进入dfs时循环

个人不知道有什么问题

#include <bits/stdc++.h>
#define ll long long
#define PII pair<int, int>
#define MP make_pair
using namespace std;
const int N = 3e5 + 10;
int n, k, ans, f[N][30], cnt[N], d[N], M;
int a[N];
vector <int> g[N];
void dfs (int u, int fa)
{
	f[u][0] = fa;
	d[u] = d[fa] + 1;
	for (int i = 1; i <= M; i++)
	{
		f[u][i] = f[f[u][i - 1]][i - 1];
	}
	for (int i = 0; i < (int) g[u].size (); i++)
	{
		int v = g[u][i];
		if (v == fa)
		{
			continue;
		}
		dfs (v, u);
	}
	return;
}
void get (int u, int fa)
{
    for (int i = 0; i < (int) g[u].size (); i++)
    {
        int v = g[u][i];
        if (v == fa)
        {
            continue;
        }
        get (v, u);
        cnt[u] += cnt[v];
    }
}
inline int lca (int x, int y)
{
	if (d[x] > d[y]) swap (x, y);
	for (int i = M; i >= 0; i--)
	{
		if (d[f[y][i]] >= d[x])
		{
			y = f[y][i];
		}
	}
	if (x == y)
	{
		return x;
	}
	for (int i = M; i >= 0; i--)
	{
		if (f[x][i] != f[y][i])
		{
			x = f[x][i];
			y = f[y][i];
		}
	}
	return f[y][0];
}
int main ()
{
	cin >> n;
	M = (int) log (n) / log (2) + 1;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
	}
	for (int i = 1; i <= n - 1; i++)
	{
		int u, v;
		cin >> u >> v;
		g[u].push_back (v);
		g[v].push_back (u);
	}
	dfs (1, 0);
	for (int i = 2; i <= n; i++)
	{
		int s = a[i], t = a[i - 1];
		int fa = lca (s, t);
		cnt[s]++;
		cnt[t]++;
		cnt[fa]--;
		cnt[f[fa][0]]--;
	}
	get (1, 0);
	for (int i = 2; i <= n; i++)
	{
		cnt[a[i]]--;
	}
	for (int i = 1; i <= n; i++)
	{
		cout << cnt[i] << endl;
	}
	return 0;
}

#include <bits/stdc++.h>
#define ll long long
#define PII pair<int, int>
#define MP make_pair
using namespace std;
const int N = 3e5 + 10;
int n, k, ans, f[N][30], cnt[N], d[N], M;
int a[N];
vector <int> g[N];
void dfs (int u, int fa)
{
	f[u][0] = fa;
	d[u] = d[fa] + 1;
	for (int i = 1; i <= M; i++)
	{
		f[u][i] = f[f[u][i - 1]][i - 1];
	}
	for (int i = 0; i < (int) g[u].size (); i++)
	{
		int v = g[u][i];
		if (v == fa)
		{
			continue;
		}
		dfs (v, u);
	}
	return;
}
void get (int u, int fa)
{
    for (int i = 0; i < (int) g[u].size (); i++)
    {
        int v = g[u][i];
        if (v == fa)
        {
            continue;
        }
        get (v, u);
        cnt[u] += cnt[v];
    }
}
inline int lca (int x, int y)
{
	if (d[x] > d[y]) swap (x, y);
	for (int i = M; i >= 0; i--)
	{
		if (d[f[y][i]] >= d[x])
		{
			y = f[y][i];
		}
	}
	if (x == y)
	{
		return x;
	}
	for (int i = M; i >= 0; i--)
	{
		if (f[x][i] != f[y][i])
		{
			x = f[x][i];
			y = f[y][i];
		}
	}
	return f[y][0];
}
int main ()
{
	cin >> n;
	M = (int) log (n) / log (2) + 1;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
	}
	for (int i = 1; i <= n - 1; i++)
	{
		int u, v;
		cin >> u >> v;
		g[u].push_back (v);
		g[v].push_back (u);
	}
	dfs (1, 0);
	for (int i = 2; i <= n; i++)
	{
		int s = a[i], t = a[i - 1];
		int fa = lca (s, t);
		cnt[s]++;
		cnt[t]++;
		cnt[fa]--;
		cnt[f[fa][0]]--;
	}
	get (1, 0);
	for (int i = 2; i <= n; i++)
	{
		cnt[a[i]]--;
	}
	for (int i = 1; i <= n; i++)
	{
		cout << cnt[i] << endl;
	}
	return 0;
}

2023/11/23 20:04
加载中...