【牛客 - 303K第十五届浙江大学宁波理工学院程序设计大赛(同步赛)】Technology Tree(树形dp,tricks)

题干:
 

在星际争霸(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

输入

复制

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

说明

第一组样例:如果想要建造建筑1,总共需要消耗1晶体矿和5高能瓦斯。如果想要建造建筑2,需要先建造建筑1,总共需要消耗1+10晶体矿和5+100高能瓦斯。
如果想要建造建筑3,需要先建造建筑1,总共需要消耗1+200晶体矿和5+50高能瓦斯。
如果想要建造建筑4,需要先建造建筑1和建筑2,总共需要消耗1+10+66晶体矿和5+100+88高能瓦斯。

解题报告:

   就是记忆化一个树形dp就行了呗,,不算难想。但是因为输入的巧妙,这题可以用巧妙的解法,详见下面Qls的思路。OrzOrz

 

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
#define fi first
#define se second
using namespace std;
const int MAX = 2e4 + 5;
struct Node {int j,g;
} node[MAX];
int pre[MAX];
ll dpg[MAX],dpj[MAX];
ll dfsg(int cur,int root) {if(cur == 1) return dpg[1] = node[1].g ;if(dpg[cur] != -1) return dpg[cur];dpg[cur]=0;dpg[cur] += dfsg(pre[cur],cur);dpg[cur] += node[cur].g;return dpg[cur];
}
ll dfsj(int cur,int root) {if(cur == 1) return dpj[1] = node[1].j ;if(dpj[cur] != -1) return dpj[cur];dpj[cur]=0;dpj[cur] += dfsj(pre[cur],cur);dpj[cur] += node[cur].j;return dpj[cur];
}
int main()
{int t,a,b,q,n;cin>>t;while(t--) {memset(dpj,-1,sizeof dpj);memset(dpg,-1,sizeof dpg); //chushihuascanf("%d%d",&n,&q);for(int i = 1; i<=n; i++) {scanf("%d%d",&node[i].j,&node[i].g);}for(int i = 2,x; i<=n; i++) {scanf("%d",&x);pre[i]=x;}for(int i = 1; i<=n; i++) {dfsg(i,-1);dfsj(i,-1);}int x;while(q--) {scanf("%d",&x);printf("%lld %lld\n",dpj[x],dpg[x]);}}return 0 ;}

其实这个代码完全可以返回一个结构体或者用pair或者用两个引用,,但是这里因为懒惰,,没有改代码,(因为第一次写的时候不知道要求输出 晶体矿和高能瓦斯 分开输出。所以就写了一个dp,,然后发现输出格式后又懒得改然后就直接复制一波,改改变量就交了、)

Qls思路:(因为这题是按照顺序读入的:fi(1≤fi<i)   所以可以这么写,,也算是个小技巧吧,,,不这么读入的话,就不能这么状态转移了,,所以还是老老实实写树上的吧)

#include<bits/stdc++.h>
using namespace std;
const int MAXN=20005;
int a[MAXN],b[MAXN];
int main()
{int T;scanf("%d",&T);while(T--){int n,q;scanf("%d%d",&n,&q);for(int i=1;i<=n;i++)scanf("%d%d",&a[i],&b[i]);for(int i=2;i<=n;i++){int f;scanf("%d",&f);a[i]+=a[f],b[i]+=b[f];}for(int i=1;i<=q;i++){int x;scanf("%d",&x);printf("%d %d\n",a[x],b[x]);}}return 0;
}

ps:神仙就是神仙,,,一小时秒了九个题,,强势Rank1、、OrzOrz

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/441024.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle基表恢复,查找V$PARAMETER 基表 – 专业Oracle数据库恢复,或许是您恢复数据的最后机会@phone:13429648788 - 专业Oracle数据库恢复技术支持...

1、使用trace查找show parameter执行语句alter session set events 10046 trace name context forever,level 12;show parameter process;alter session set events 10046 trace name context off;2、查找trace文件SELECT d.VALUE|| /|| LOWER (RTRIM (i.INSTANCE, CHR (0)))||…

【HDU - 1599】find the mincost route (Floyd最小环,最短路问题)

题干&#xff1a; 杭州有N个景区&#xff0c;景区之间有一些双向的路来连接&#xff0c;现在8600想找一条旅游路线&#xff0c;这个路线从A点出发并且最后回到A点&#xff0c;假设经过的路线为V1,V2,....VK,V1,那么必须满足K>2,就是说至除了出发点以外至少要经过2个其他不同…

linux中创建目录树,如何在C++/Linux中创建目录树?

Jonathan Lef..58这是一个可以用C编译器编译的C函数./*(#)File: $RCSfile: mkpath.c,v $(#)Version: $Revision: 1.13 $(#)Last changed: $Date: 2012/07/15 00:40:37 $(#)Purpose: Create all directories in path(#)Author: J Leffler(#)Copyright: (C) JLSS 1990-91,1997-98…

linux socket bind 内核详解,Socket与系统调用深度分析(示例代码)

1、 什么是系统调用操作系统通过系统调用为运行于其上的进程提供服务。当用户态进程发起一个系统调用&#xff0c; CPU 将切换到 内核态 并开始执行一个 内核函数 。 内核函数负责响应应用程序的要求&#xff0c;例如操作文件、进行网络通讯或者申请内存资源等。在Linux中系统调…

【UVA - 11729】Commando War (贪心,时间调度问题)

题干&#xff1a;&#xff08;Uva不放题干了&#xff09; 题目大意&#xff1a;&#xff08;实在是自己懒得写网上找了一个&#xff09; 解题报告&#xff1a; 调度问题&#xff0c;直接贪心出完成任务需要的时间最长的那个人排序&#xff0c;就行了。 方法正确性的证明以前也…

【UVA - 1335】Beijing Guards (贪心,二分)

题干&#xff1a; 题目大意&#xff1a; 有n个人为成一个圈&#xff0c;其中第i个人想要r[i]种不同的礼物&#xff0c;相邻的两个人可以聊天&#xff0c;炫耀自己的礼物。如果两个相邻的人拥有同一种礼物&#xff0c;则双方都会很不高兴&#xff0c;问最少需要多少种不同的礼…

linux两个命令一起,paste命令 – 合并两个文件

paste命令会把每个文件以列对列的方式&#xff0c;一列列地加以合并 &#xff0c;他就是相当于把两个不同的文件内容粘贴在一起&#xff0c;形成新的文件。注意&#xff1a;paste默认粘贴方式以列的方式粘贴&#xff0c;但是并不是不能以行的方式粘贴&#xff0c;加上-s选项就可…

【UVA - 11292】Dragon of Loowater (贪心,水题,模拟,twopointer双指针)

题干&#xff1a; 题目大意&#xff1a; n条恶龙&#xff0c;m个勇士&#xff0c;用勇士来杀恶龙。一个勇士只能杀一个恶龙。而且勇士只能杀直径不超过自己能力值的恶龙。每个勇士需要支付能力值一样的金币。问杀掉所有恶龙需要花费的最少金币。 解题报告&#xff1a; twopo…

linux 命令pg,linux下操作PostgreSQL的常用命令

一般性&#xff1a;\copyright 显示PostgreSQL的使用和发行许可条款\g [文件] or; 执行查询 (并把结果写入文件或 |管道)\h [名称] SQL命令语法上的说明&#xff0c;用*显示全部命令的语法说明\q 退出 psql查询缓存区\e [FILE] [LINE] 使用外部编辑器编辑查询缓存区(或文件)\ef…

【UVA - 10037】Bridge(过河问题,经典贪心)

题干&#xff1a; 题目大意&#xff1a; 有N个人要过桥&#xff0c;每个人速度不同&#xff0c;只有一个手电筒&#xff0c;每次最多只能过去两个人&#xff0c;问所有人最短的过桥时间为多少 解题报告&#xff1a; 首先让最快的两个人最后过&#xff0c;然后我们分奇偶考虑…

linux系统键盘记录器,可截获到 QQ 密码 键盘记录器源码

由于 QQ 密码做了特殊的保护&#xff0c;所以通过远程注入得到密码框内容以及通过钩子来得到键盘消息均不能探测到 QQ 的密码&#xff0c;但是通过对键盘驱动的过滤却是可以记录下 QQ 密码输入期间的内容&#xff0c;附上源码。#define DBG 1#include #include #include "…

【牛客 - 2B】树(思维,dp,有坑)

题干&#xff1a; shy有一颗树&#xff0c;树有n个结点。有k种不同颜色的染料给树染色。一个染色方案是合法的&#xff0c;当且仅当对于所有相同颜色的点对(x,y)&#xff0c;x到y的路径上的所有点的颜色都要与x和y相同。请统计方案数。 输入描述: 第一行两个整数n&#xf…

linux安装后启动mysql,linux安装完mysql后启动错误

redhat as 4,使用rpm包安装完mysql的server 跟client后执行以下命令出错。[rootftp etc]# /usr/bin/mysqladmin -u root password new-password/usr/bin/mysqladmin: connect to server at localhost failederror: Cant connect to local MySQL server through socket /var/lib…

linux exchange邮件客户端,Linux中使用Hiri邮件客户端访问Exchange帐户

大家都知道 Microsoft Exchange 是企业级邮件市场占有率第一的产品&#xff0c;早已成为 Top 500 企业首选的邮件服务器和客户端标准配备。随着 Office 365 服务在全球的铺开&#xff0c;Exchange 的市场占有率更是越来越高&#xff0c;不少中小企业甚至个人用户都已经开始使用…

【CodeForces - 1084C】The Fair Nut and String(思维,组合数学)

题干&#xff1a; The Fair Nut found a string ss. The string consists of lowercase Latin letters. The Nut is a curious guy, so he wants to find the number of strictly increasing sequences p1,p2,…,pkp1,p2,…,pk, such that: For each ii (1≤i≤k1≤i≤k), sp…

群辉挂载linux nfs,Debian 9 挂载访问已设置的群晖NFS共享文件目录

说明博主先后尝试了 webdav、Samba方案后&#xff0c;最后毅然决然选择NFS的方案&#xff0c;通过挂载群晖的NFS共享文件目录作为Jellyfin的媒体库&#xff0c;媒体播放通常单个文件都比较大&#xff0c;而webdav在读取过程中需要比较长的缓存时间大文件传输并不友好。之前试过…

【牛客 - 289H】约会(思维,数学,奇偶数,水题)

题干&#xff1a; Hang等了一年&#xff0c;终于&#xff0c;朝气蓬勃的小学妹来了&#xff0c;在开学当天&#xff0c;就成功打入协会迎新群&#xff0c;在Hang的魅力&#xff08;死皮赖脸&#xff09;之下&#xff0c;有个小学妹要和他面基了&#xff0c;小学妹说&#xf…

c语言中调试时go的作用,C语言调用GO

C语言调用GO最近工作中遇到需要在c语言里面调用go语言的需求&#xff0c;总结了一下&#xff0c;下面代码里面的每一个注释都很有用&#xff0c;闲话不多说&#xff0c;直接上代码~示例GO代码&#xff1a;package main // 这个文件一定要在main包下面import "C" // 这…

【CodeForces - 768C】Jon Snow and his Favourite Number(思维,技巧,套路,数学异或,循环节,trick)

题干&#xff1a; Jon Snow now has to fight with White Walkers. He has n rangers, each of which has his own strength. Also Jon Snow has his favourite number x. Each ranger can fight with a white walker only if the strength of the white walker equals his st…

C语言第六次作业指针,c语言第六次作业解析

《c语言第六次作业解析》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《c语言第六次作业解析(36页珍藏版)》请在人人文库网上搜索。1、c 语言第六次作业解析第六次作业&#xff1a;指针(以下题目如无特殊声明&#xff0c; 请使用指针技术实现 , 尽量不要使用数组作为…