#include <bits/stdc++.h>
using namespace std;
const int N=2010;
const int Q=1000000007;
long long tree[N];
long long mp[N];
vector<long long> adj[N];
set<vector<int>> path;
void dfs1(int fa,int now,int target,int d,vector<int>& v)
{
if(now==target)
{
for(int i=0;i<v.size();i++)
{
tree[v[i]]+=d;
}
return ;
}
for(int i=0;i<adj[now].size();i++)
{
if(adj[now][i]!=fa)
{
v.push_back(adj[now][i]);
dfs1(now,adj[now][i],target,d,v);
v.pop_back();
}
}
}
void dfs2(int fa,int now,vector<int>& v,int l,int r)
{
if(v.size()>r) return ;
if(v.size()>=l && v.size()<=r)
{
vector<int> tmp(v);
sort(tmp.begin(),tmp.end());
path.insert(tmp);
}
for(int i=0;i<adj[now].size();i++)
{
if(adj[now][i]!=fa)
{
v.push_back(adj[now][i]);
dfs2(now,adj[now][i],v,l,r);
v.pop_back();
}
}
}
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin>>t;
while(t--)
{
int n,m,l,r;
cin>>n>>m>>l>>r;
path.clear();
memset(tree,0,sizeof(tree));
memset(mp,0,sizeof(mp));
for(int i=1;i<=n+1;i++) adj[i].clear();
for(int i=1;i<=n;i++)
{
cin>>tree[i];
}
for(int i=1;i<n;i++)
{
int fi;
cin>>fi;
adj[i+1].push_back(fi);
adj[fi].push_back(i+1);
}
for(int i=1;i<=n;i++)
{
vector<int> tmp;
tmp.push_back(i);
dfs2(-1,i,tmp,l,r);
}
for(auto v:path)
{
for(int k=0;k<v.size();k++)
{
mp[v[k]]++;
}
}
for(int i=0;i<m;i++)
{
int u,v,d;
cin>>u>>v>>d;
if(u<v) swap(u,v);
vector<int> tmp;
tmp.push_back(u);
dfs1(-1,u,v,d,tmp);
long long res=0;
for(int i=1;i<=n;i++)
{
res=(res+(tree[i]*mp[i])%Q)%Q;
}
cout<<res<<endl;
}
}
return 0;
}
CCF-CSP 201803-5 二次求和 30分
于 2022-05-30 00:24:55 首次发布