社区讨论

关于 CF E

学术版参与者 6已保存回复 10

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
10 条
当前快照
1 份
快照标识符
@lo2x1qk2
此快照首次捕获于
2023/10/23 21:11
2 年前
此快照最后确认于
2023/10/23 21:11
2 年前
查看原帖
为啥让深度小于 1000 的暴力做否则记搜的复杂度是对的。
CPP
#include<bits/stdc++.h>

using namespace std;
 
#define ll long long
#define M 100005 
#define inf 1e18

int n,q;
int p[M];
ll a[M];
vector<int> g[M];

unordered_map<int,ll> dp[M];

ll dfs(int x,int y){
	if(dp[x][y]) return dp[x][y];
	if(x==0&&y==0) return 0;
	return dp[x][y]=dfs(p[x],p[y])+a[x]*a[y];
}

int dep[M];

void dfs2(int u){
	for(auto v:g[u]){
		dep[v]=dep[u]+1;
		dfs2(v);
	}
}

ll dfs3(int x,int y){
	if(x==0&&y==0) return 0;
	return dfs3(p[x],p[y])+a[x]*a[y];
}

int main(){
	scanf("%d %d",&n,&q);
	for(int i=1;i<=n;++i) scanf("%lld",&a[i]);
	for(int i=2;i<=n;++i) scanf("%d",&p[i]),g[p[i]].push_back(i);
	dfs2(1);
	int maxn=0;
	for(int i=1;i<=n;++i) maxn=max(maxn,dep[i]);
	int B=1000;
	while(q--){
		int x,y;
		scanf("%d %d",&x,&y);
		if(dep[x]<=B) printf("%lld\n",dfs3(x,y));
		else printf("%lld\n",dfs(x,y));
	}
	return 0;
}

回复

10 条回复,欢迎继续交流。

正在加载回复...