MLE了怎么办
查看原帖
MLE了怎么办
491741
王昊岩123楼主2024/7/12 17:02

rt

#include<bits/stdc++.h>
#define N 50005
#define B 22
using namespace std;
int n;
int a[N];
vector<int> up[N];
vector<int> dn[N]; 
struct node
{
	int from,to,next;
}e[N << 1];
int head[N],cnt;
int b[N],c[N];
int f[N][19],son[N],dep[N],top[N],d[N];
int lo2[N];
int sum[N][B + 5];
void add(int u,int v)
{
	e[++cnt].from = u;
	e[cnt].to = v;
	e[cnt].next= head[u];
	head[u] = cnt;
}
void dfs1(int x,int fa)
{
	f[x][0] = fa;
	dep[x] = d[x] = d[fa] + 1;
	for(int j = 1;j <= 18;j++) f[x][j] = f[f[x][j - 1]][j - 1];
	for(int i = head[x];i;i = e[i].next)
	{
		int k = e[i].to;
		if(k != fa) dfs1(k,x);
		if(dep[k] > dep[x]) dep[x] = dep[k],son[x] = k;
	}
}
void dfs2(int x,int fa,int tt)
{
	top[x] = tt;
	for(int i = 1,p = f[x][0];i <= B;i ++,p = f[p][0]) sum[x][i] = sum[p][i] + a[x];
	if(x == tt)
	{
		for(int i = 0,v = x;i <= dep[x] - d[x];i++)
			up[x].push_back(v),v = f[v][0];
		for(int i = 0,v = x;i <= dep[x] - d[x];i++)
			dn[x].push_back(v),v = son[v];
	}
	if(son[x]) dfs2(son[x],x,tt);
	for(int i = head[x];i;i = e[i].next)
	{
		int k = e[i].to;
		if(k != son[x] && k != fa) dfs2(k,x,k);
	}
} 
int kth(int x,int ci)
{
	if(d[x] <= ci) return 0;
	if(!ci) return x;
	x = f[x][lo2[ci]];
	ci -= (1 << lo2[ci]);
	ci -= d[x] - d[top[x]];x = top[x];
	return ci >= 0 ? up[x][ci] : dn[x][-ci];
}
int lca(int u,int v)
{
	if(d[u] <= d[v]) swap(u,v);
	for(int i = 18;i >= 0;i--)
		if(d[f[u][i]] >= d[v]) u = f[u][i];
	if(u == v) return u;
	for(int i = 18;i >= 0;i--)
		if(f[u][i] != f[v][i]) u = f[u][i],v = f[v][i];
	return f[u][0];
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin >> n;
	for(int i = 1;i <= n;i++) cin >> a[i];
	for(int i = 1;i <= n - 1;i++)
	{
		int u,v;
		cin >> u >> v;
		add(u,v);
		add(v,u);
	}	
	for(int i = 1;i <= n;i++) cin >> b[i];
	for(int i = 1;i < n;i++) cin >> c[i];
	lo2[1] = 0;
	for(int i = 2;i <= n;i++) lo2[i] = lo2[i >> 1] + 1;
	dfs1(1,0);
	dfs2(1,0,1);
	for(int i = 1;i < n;i++)
	{
		int u = b[i],v = b[i + 1];
		int k = c[i];
		int anc = lca(u,v);
		int res = 0;
		int dis = d[u] + d[v] - 2 * d[anc];
		//cout << u << " " << v << " " << anc << " " << d[u] << " " << d[v] << " " << dis % k << endl;
		if(k <= B)
		{
			int numu = (d[u] - d[anc]) / k + 1;
			res += sum[u][k] - sum[kth(u,k * numu)][k];
			int numv = (d[v] - d[anc]) / k + 1;
			res += sum[v][k] - sum[kth(v,k * numv)][k];
			if((d[u] - d[anc]) % k == 0 && (d[v] - d[anc]) % k == 0) res -= a[anc];
			cout << res << endl; 
		}
		else
		{
			for(int j = u;d[j] >= d[anc];j = kth(j,k)) res += a[i];
			for(int j = v;d[j] >= d[anc];j = kth(j,k)) res += a[i];
			if((d[u] - d[anc]) % k == 0 && (d[v] - d[anc]) % k == 0) res -= a[anc];
			cout << res << endl; 
		} 
	}
	return 0;
}
2024/7/12 17:02
加载中...