解题思路:
运用结构体解题,将晶体矿和高能瓦斯的数量分别放在两个数组里。再根据第i个(1≤i<n)正整数fi(1≤fi<i)表示建筑i+1的前置建筑为fi,将数组里的数进行求和即可。
注意题目中说道,在科技树中,只有一个建筑是不需要前置建筑的,我们把这个建筑的编号设为1。其他的建筑,有且仅有一个前置建筑。因此我们应该注意 下标问题……(即注意i,j,f,x的关系)
另外还要注意,这一个测试用例里面有3个循环……
#include<stdio.h> #include<string.h> typedef struct { int jing; int gao; }construction; int main() { int T; scanf("%d",&T); while(T--) { int n,q; construction con[20000]; scanf("%d %d",&n,&q); for(int i = 1;i <= n;i++)//从1开始!! { scanf("%d",&con[i].jing); scanf("%d",&con[i].gao); } for(int j = 2;j <= n;j++)//从2开始!! { int f; scanf("%d",&f); con[j].jing += con[f].jing; con[j].gao += con[f].gao; } while(q--) { int x; scanf("%d",&x); printf("%d %d\n",con[x].jing,con[x].gao); } } return 0; }
PS:结构体 举个例子……
#include <stdio.h> #include <string.h> typedef struct { char name[100]; int age; }student; int main() { student stu[10]; char name[] = "feifei"; strcpy(stu[0].name,name); printf("%s",stu[0].name);//第一种,字符类型 stu[0].age = 100; stu[1].age = 120; printf("%d %d",stu[0].age,stu[1].age);//第二种,整数类型 student stu[3]; for(int i = 0;i < 3;i++) { scanf("%s",stu[i].name); scanf("%d",&stu[i].age); printf("%s %d\n",stu[i].name,stu[i].age);//第三种,两种类型同时出现 } return 0; }