Technology Tree(第十五届浙江大学宁波理工学院程序设计大赛K)

Technology Tree

题目传送门
题目描述
在星际争霸(StarCraft)中,有3个种族。对于任意一个种族,他们的建筑建造都是有一个顺序的。这个顺序正好是一个树形结构,我们称之为"科技树"(Technology tree)。
在科技树中,只有一个建筑是不需要前置建筑的,我们把这个建筑的编号设为1。其他的建筑,有且仅有一个前置建筑。
比如建筑2的前置建筑为建筑1,意思是只有先建造了建筑1,才能建造建筑2。
一个种族有n个建筑,建筑1没有前置建筑,建筑i(2≤i≤n)的前置建筑为f。每个建筑的建造都需要费用,建筑i(1≤i≤n)的建造花费为a晶体矿和b高能瓦斯。
现在tokitsukaze想知道,如果想要建造建筑x,总共需要消耗多少晶体矿和高能瓦斯。

输入描述:
第一行包含一个T(T≤10),表示T组数据。
对于每组数据:
第一行包含两个正整数n,q(1≤n,q≤20000),表示有n个建筑和q次查询。
接下来n行,每行包含两个整数a,b(0≤a,b≤300),表示建造建筑i需要花费a晶体矿和b高能瓦斯。
接下来一行,包含n-1个正整数f(1≤f≤n)。第i个(1≤i<n)正整数fi(1≤fi<i)表示建筑i+1的前置建筑为fi。
接下来q行,每行包含一个正整数x,表示询问。

输出描述:
对于每个询问,输出一行,包含两个整数c,d(用空格隔开),表示如果想要建造建筑x,总共需要消耗c晶体矿和d高能瓦斯。

示例
输入
1
4 4
1 5
10 100
200 50
66 88
1 1 2
1
2
3
4

输出
1 5
11 105
201 55
77 193
这个题用数组存放每个建筑的需求,询问时直接输出即可,不过一定要注意数组的下标问题。还是细节问题。

#include<stdio.h>
int main()
{
    int T,n,q,a,b,f,x,l[20000][2],m[20000],z[20000][2];
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&q);
        for(int i=0;i<n;i++)
        {
            scanf("%d%d",&a,&b);
            l[i][0]=a;l[i][1]=b;
        }
        for(int i=0;i<n-1;i++)
        {
            scanf("%d",&f);
            m[i]=f;
        }
        z[0][0]=l[0][0];z[0][1]=l[0][1];
        for(int i=1;i<n;i++)
        {
            z[i][0]=l[i][0]+z[m[i-1]-1][0];
            z[i][1]=l[i][1]+z[m[i-1]-1][1];
        }
        for(int i=0;i<q;i++)
        {
            scanf("%d",&x);
            printf("%d %d\n",z[x-1][0],z[x-1][1]);
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值