Rt,本地编译过了,洛谷没过,我很少用vector所以不太了解,下面是编译信息。
Can't compile file:
program.cpp:22:2: error: 'vector' does not name a type
vector<int> son;
^~~~~~
program.cpp: In function 'void treedp(int)':
program.cpp:26:14: error: 'struct tree' has no member named 'son'
if(!tr[now].son.size()){tr[now].dmax=tr[now].x;return;}
^~~
program.cpp:27:23: error: 'struct tree' has no member named 'son'
for(ui i=0;i<tr[now].son.size();i++)
^~~
program.cpp:29:19: error: 'struct tree' has no member named 'son'
int son=tr[now].son[i];
^~~
program.cpp: In function 'void solve()':
program.cpp:42:9: error: 'struct tree' has no member named 'son'
tr[i].son.clear(),tr[i].dmax=MAXN;
^~~
program.cpp:46:24: error: 'struct tree' has no member named 'son'
scanf("%d",&x),tr[x].son.push_back(i);
^~~
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ri register int
#define ui unsigned int
using namespace std;
typedef long long ll;
const int MAXN=2147483646;
int T,n,x;
struct tree
{
int x,f,dmax;
vector<int> son;
}tr[200010];
void treedp(int now)
{
if(!tr[now].son.size()){tr[now].dmax=tr[now].x;return;}
for(ui i=0;i<tr[now].son.size();i++)
{
int son=tr[now].son[i];
treedp(son);
tr[now].dmax=min(tr[now].dmax,tr[son].dmax);
}
if(now!=1&&tr[now].dmax>tr[now].x)
tr[now].dmax=tr[now].x+(tr[now].dmax-tr[now].x)/2;
}
void solve()
{
scanf("%d",&n);
for(ri i=1;i<=n;i++)
{
scanf("%d",&tr[i].x);
tr[i].son.clear(),tr[i].dmax=MAXN;
tr[i].f=tr[i].x;
}
for(ri i=2;i<=n;i++)
scanf("%d",&x),tr[x].son.push_back(i);
treedp(1);
printf("%d\n",tr[1].x+tr[1].dmax);
}
int main()
{
scanf("%d",&T);
while(T--) solve();
return 0;
}