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 买一送一的更多相关文章

  1. caioj:1682: 【贪心】买一送一

    题目描述 [题意]    CH最近在网上发现干草买一送一的一笔交易,他每买一捆尺寸为A的干草,就可以免费获赠一捆尺寸为 B (1 ≤ B < A)的干草,注意B < A.    然而,这个 ...

  2. 牛客假日团队赛2 A.买一送一

    链接: https://ac.nowcoder.com/acm/contest/924/A 题意: Farmer John在网上买干草.他发现了一笔特殊的买卖.他每买一捆大小为A(1 <= A ...

  3. 2019牛客国庆集训派对day3 买一送一

    题目链接: 题意:有n个点,n-1条单向边,每个点都销售一类商品 问从点1开始走,买第一样商品类型为x,买第二样商品类型为y,问不同有序对<x,y>的数量 解法: col[i]表示这个点的 ...

  4. [牛客] [#1108 J] [树形结构] 买一送一

    2019牛客国庆集训派对day3 链接:https://ac.nowcoder.com/acm/contest/1108/J来源:牛客网 题意 ICPCCamp 有 n 个商店,用 $1,2,..., ...

  5. 应用程序框架实战十八:DDD分层架构之聚合

    前面已经介绍了DDD分层架构的实体和值对象,本文将介绍聚合以及与其高度相关的并发主题. 我在之前已经说过,初学者第一步需要将业务逻辑尽量放到实体或值对象中,给实体“充血”,这样可以让业务逻辑高度内聚, ...

  6. 小菜学习设计模式(一)—模板方法(Template)模式

    前言 设计模式目录: 小菜学习设计模式(一)—模板方法(Template)模式 小菜学习设计模式(二)—单例(Singleton)模式 小菜学习设计模式(三)—工厂方法(Factory Method) ...

  7. 比较牛X的互联网公司都有哪些作死的行为

    以下为近乎家的小近吐血整理: 1流氓行为 臭表碾说的就是你们!   百度 还有这种伪造网页弹窗: 360 不经同意,也不弹窗提醒,直接给我们安装推广软件.比较典型的是 腾讯 腾讯一直走在行业最前端,买 ...

  8. CSS笔记1

    一. 列表 列表是有三种形式 1.1   无序列表 无序列表,用来表示一个列表语义,并且每个项目与项目之间是不分先后顺序的 ul 的英文unordered list "无序列表" ...

  9. CSS的应用

    CSS基础入门 目录 一.   列表.................................................................................. ...

随机推荐

  1. 梦织未来Windows驱动编程 第05课 小结(读取另一驱动,遍历所有驱动)

    读取另一驱动 驱动通过"\\Driver\\XueTr"获取到了XueTr工具的驱动,并Hook了XueTr驱动的分发函数. 具体的驱动代码如下: //FilterDriver.c ...

  2. pat乙级1045

    从左到右扫描时记录扫描到当前下标为止的最大值,如果当前元素大于这个最大值,那么它就大于它左边的所有值.同理,从右到左扫描记录扫描到当前下标为止的最小值,如果当前元素小于这个最大小值,那么它就小于它右边 ...

  3. JS中的异常exception

    js提供了一套异常处理机制.异常是干扰程序的正常流程的不寻常事故,当发生这样的事故时,你的程序应该抛出一个异常 try_it() { try { console.log(add("1&quo ...

  4. Liunx开发(Extjs4.1+desktop+SSH2超强视频教程实践)(2)

    然后装eclipse: 为啥默认是搜狗导航: java还没装呢: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downlo ...

  5. vue登录权限

    登录:当用户填写完账号和密码后向服务端验证是否正确,验证通过之后,服务端会返回一个token,拿到token之后(我会将这个token存贮到cookie中,保证刷新页面后能记住用户登录状态),前端会根 ...

  6. 【洛谷4149】[IOI2011] Race(点分治)

    点此看题面 大致题意: 给你一棵树,问长度为\(K\)的路径至少由几条边构成. 点分治 这题应该比较显然是点分治. 主要思路 与常见的点分治套路一样,由于\(K≤1000000\),因此我们可以考虑开 ...

  7. Python实现购物小程序

    一.需求 1.登录 { ‘xxx1’:{'passwd':'123','role':1,'moeny':10000,"carts":['mac']}, 'xxx1':{'passw ...

  8. 网络编程——网络模型和InetAddress类

    第1章 网络通信协议 通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样.在计算机网络中,这些连接和 ...

  9. Java之JDK的下载与安装,java环境变量的配置,Editplus的下载与使用

    JRE(Java Runtime Environment Java运行环境) 包括Java虚拟机(JVM Java Virtual Machine)和Java程序所需的核心类库等,如果想要运行一个开发 ...

  10. C#条件运算符(?:)

    一.C#条件运算符(?:) 条件运算符(?:),有时也称为三元操作符“?:”.它是根据布尔型表达式的值返回?后面的两个值中的一个.如果条件为True,则计算第一个表达式并以它的计算结果为准:如果条件为 ...