CSU-2172 买一送一
CSU-2172 买一送一
Description
ICPCCamp 有 n 个商店,用 1, 2, …, n 编号。对于任意 i > 1,有从商店 \(p_i\) 到 i 的单向道路。 同时,商店 i 出售类型为 \(a_i\) 的商品。
Bobo 从商店 1 出发前往商店 i。他要在两个不同的商店购买商品(包括商店 1 和 i)。设他先购买的商品类型是 x,后购买的商品类型是 y,他用 \(f_i\) 表示不同的有序对 ⟨x, y⟩ 的数量。 求出 \(f_2, f_3, …, f_n\) 的值。
- 1 ≤ n ≤ \(10^5\)
- 1 ≤ \(p_i\) < i
- 1 ≤ \(a_i\) ≤ n
- n 的总和不超过 5 × \(10^5\).
Input
输入文件包含多组数据,请处理到文件结束。
每组数据的第一行包含 1 个整数 n.
第二行包含 (n − 1) 个整数 \(p_2, p_3, …, p_n\).
第三行包含 n 个整数 \(a_1, a_2, …, a_n\).
Output
对于每组数据输出 (n − 1) 个整数表示 \(f_2, f_3 … f_n\).
Sample Input
3
1 2
1 2 3
3
1 1
1 2 3
4
1 2 3
1 3 2 3
Sample Output
1
3
1
1
1
3
5
Hint
对于第三个样例,当 i = 4 时,可能的有序对 ⟨x, y⟩ 有 ⟨1, 2⟩,⟨1, 3⟩,⟨2, 3⟩,⟨3, 2⟩,⟨3, 3⟩ 共 5 种。所以 \(f_4 = 5\).
题解
这个题是一道搜索题,一个点的有序对数目等于它上一个点的有序对数目+到目前为止出现过的商品总数-这个点上一次出现时的有序对数目(避免重复计算),我们用一个pre数组记录一下上一个该商品出现时的商品数目,用一个vis数组记录一下一个商品是否出现过,回溯一下就可以AC了
#include<bits/stdc++.h>
#define maxn 100050
using namespace std;
vector<int> G[maxn];
int a[maxn];
long long f[maxn];
int vis[maxn];
long long pre[maxn];
void dfs(int u, int fa, int cnt) {
	for (int i = 0; i < G[u].size(); i++) {
		int v = G[u][i];
		if (!vis[a[u]]) cnt++;
		vis[a[u]]++;
		f[v] = f[u] + cnt - pre[a[v]];
		int tmp = pre[a[v]];
		pre[a[v]] = cnt;
		dfs(v, u, cnt);
		vis[a[u]]--;
		if (vis[a[u]] == 0) cnt--;
		pre[a[v]] = tmp;
	}
}
int main() {
	int n;
	while (scanf("%d", &n) != EOF) {
		memset(f, 0, sizeof(f));
		memset(vis, 0, sizeof(vis));
		for (int i = 0; i <= n; i++) {
			G[i].clear();
		}
		for (int i = 2; i <= n; i++) {
			int x;
			scanf("%d", &x);
			G[x].push_back(i);
		}
		for (int i = 1; i <= n; i++) {
			scanf("%d", &a[i]);
		}
		if (n == 1) continue;
		dfs(1, 0, 0);
		for (int i = 2; i <= n; i++) {
			printf("%lld\n", f[i]);
		}
	}
	return 0;
}
/**********************************************************************
	Problem: 2172
	User: Artoriax
	Language: C++
	Result: AC
	Time:576 ms
	Memory:17568 kb
**********************************************************************/
CSU-2172 买一送一的更多相关文章
- caioj:1682: 【贪心】买一送一
		题目描述 [题意] CH最近在网上发现干草买一送一的一笔交易,他每买一捆尺寸为A的干草,就可以免费获赠一捆尺寸为 B (1 ≤ B < A)的干草,注意B < A. 然而,这个 ... 
- 牛客假日团队赛2 A.买一送一
		链接: https://ac.nowcoder.com/acm/contest/924/A 题意: Farmer John在网上买干草.他发现了一笔特殊的买卖.他每买一捆大小为A(1 <= A ... 
- 2019牛客国庆集训派对day3 买一送一
		题目链接: 题意:有n个点,n-1条单向边,每个点都销售一类商品 问从点1开始走,买第一样商品类型为x,买第二样商品类型为y,问不同有序对<x,y>的数量 解法: col[i]表示这个点的 ... 
- [牛客] [#1108 J] [树形结构] 买一送一
		2019牛客国庆集训派对day3 链接:https://ac.nowcoder.com/acm/contest/1108/J来源:牛客网 题意 ICPCCamp 有 n 个商店,用 $1,2,..., ... 
- 应用程序框架实战十八:DDD分层架构之聚合
		前面已经介绍了DDD分层架构的实体和值对象,本文将介绍聚合以及与其高度相关的并发主题. 我在之前已经说过,初学者第一步需要将业务逻辑尽量放到实体或值对象中,给实体“充血”,这样可以让业务逻辑高度内聚, ... 
- 小菜学习设计模式(一)—模板方法(Template)模式
		前言 设计模式目录: 小菜学习设计模式(一)—模板方法(Template)模式 小菜学习设计模式(二)—单例(Singleton)模式 小菜学习设计模式(三)—工厂方法(Factory Method) ... 
- 比较牛X的互联网公司都有哪些作死的行为
		以下为近乎家的小近吐血整理: 1流氓行为 臭表碾说的就是你们! 百度 还有这种伪造网页弹窗: 360 不经同意,也不弹窗提醒,直接给我们安装推广软件.比较典型的是 腾讯 腾讯一直走在行业最前端,买 ... 
- CSS笔记1
		一. 列表 列表是有三种形式 1.1 无序列表 无序列表,用来表示一个列表语义,并且每个项目与项目之间是不分先后顺序的 ul 的英文unordered list "无序列表" ... 
- CSS的应用
		CSS基础入门 目录 一. 列表.................................................................................. ... 
随机推荐
- LAMP stack-5.6.22 (OpenLogic CentOS 7.2)
			平台: CentOS 类型: 虚拟机镜像 软件包: apache2.4.20 mysql5.6.30 php5.6.22 apache application server basic softwar ... 
- instanceof 关键字
			boolean = Object(类引用名) instanceof Class(类名) 作用:判断符号左边的引用指向的对象是否是右边这个类的对象: 
- JS修改地址栏参数实例代码
			function changeURLPar(destiny, par, par_value) { var pattern = par+'=([^&]*)'; var replaceText = ... 
- hihoCoder  hiho一下 第十二周  #1055 : 刷油漆  (树上DP)
			思路: 只能刷部分节点数m,总节点数n.如果m>=n那么就可以全刷了,那就不用任何算法了.如果m<n那么就要有取舍了.用DP思路,记录下每个节点如果获得到1~m个选择所能获得的最大权值.这 ... 
- pat甲级1123
			1123 Is It a Complete AVL Tree(30 分) An AVL tree is a self-balancing binary search tree. In an AVL t ... 
- c++树的表示方法
			c++树的节点的表示方法: typedef struct Node *Tree; struct Node { int data; Node *left; Node *right; int flag; ... 
- PHP中MySQL数据库连接,数据读写,修改方法
			MySQL连接大的来说有两种方法,一种是mysqli,另一种是mysql.php为连接MySQL提供了函数库,有mysql和mysqli,mysqli是mysql函数库的扩展,是php5才支持的.当你 ... 
- 倍增LCA
			前言 在做树上问题时,我们经常会遇到 \(LCA\)(最近公共祖先)问题.曾经的我遇到这类问题只会\(O(n)\)暴力求解,学了倍增\(LCA\),就可以\(O(logn)\)解决了. 简介 倍增\( ... 
- Problem G: 圆周率
			Problem G: 圆周率 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 155 Solved: 99[Submit][Status][Web Bo ... 
- python_60_装饰器3
			#嵌套函数 def foo(): print('in the foo') def bar(): print('in the bar') bar() #bar()#出错,无法在外边调用,bar函数的作用 ... 
