2019牛客国庆集训派对day3 买一送一
题意:有n个点,n-1条单向边,每个点都销售一类商品
问从点1开始走,买第一样商品类型为x,买第二样商品类型为y,问不同有序对<x,y>的数量
解法:
col[i]表示这个点的商品类型
last[col[i]]表示从1到点i过程中,点i的商品类型上次出现的时候的点的父亲
vis[col[i]]表示从1到点i过程中,点i的商品类型经过次数
num[i]表示从1到点i过程中不同商品类型数量和
每次扫到新的点v时,(u为v的父亲) num[u] - num[last[col[v]]]就是需要更新的对数
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int M = 1e5 + ;
const int mod = 1e9 + ;
int num[M], vis[M], anss[M], ans, cnt, col[M], head[M], last[M];
struct node{
int next, to;
}edge[M];
void add_edge(int u, int v) {
edge[++cnt].next = head[u];
edge[cnt].to = v;
head[u] = cnt;
}
void dfs(int u, int sum, int ans) {
for(int i = head[u]; i; i = edge[i].next) {
int v = edge[i].to;
int t = ;
int lastt = last[col[v]];
vis[col[v]]++;
if(vis[col[v]] == ) num[v] = num[u] + ;
else num[v] = num[u];
t = num[u] - num[last[col[v]]];
last[col[v]] = u;
//printf("%d %d %d\n", v, col[v], last[col[v]]);
anss[v] = ans + t;
if(vis[col[v]] == ) dfs(v, sum + , ans + t);
else dfs(v, sum + , ans + t);
vis[col[v]]--;
last[col[v]] = lastt;
}
}
int main(){
int n;
while(~scanf("%d", &n)){
cnt = ;
memset(head, , sizeof(head));
for(int i = ; i <= n; i++) num[i] = , last[i] = , vis[i] = , anss[i] = ;
for(int i = ; i <= n; i++) {
int u;
scanf("%d", &u);
add_edge(u, i);
}
for(int i = ; i <= n; i++)
scanf("%d", &col[i]);
vis[col[]]++;
num[] = ;
dfs(, , );
// for(int i = 1; i <= n; i++) {
// printf("%d ", num[i]);
// }
// printf("\n");
for(int i = ; i <= n; i++) {
printf("%d\n", anss[i]);
}
}
return ;
}
/*
3
1 2
1 2 3
3
1 1
1 2 3
4
1 2 3
1 3 2 3
7
1 1 3 2 4 2
3 3 3 4 5 3 3
7
1 1 3 2 4 2
2 3 3 4 5 3 3
*/
2019牛客国庆集训派对day3 买一送一的更多相关文章
- 2019牛客国庆集训派对day3
E. Grid 大意: 给定$n\cdot m$个点的图, 初始无边, $q$个操作, $(1,a,b)$表示第$a$列到第$b$列全连起来, $(2,a,b)$表示把第$a$行到第$b$行全连起来, ...
- 2019牛客国庆集训派对day5
2019牛客国庆集训派对day5 I.Strange Prime 题意 \(P=1e10+19\),求\(\sum x[i] mod P = 0\)的方案数,其中\(0 \leq x[i] < ...
- 2019 牛客国庆集训派对day1-C Distinct Substrings(exkmp+概率)
链接:https://ac.nowcoder.com/acm/contest/1099/C来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...
- 计算几何板子题【2019牛客国庆集训派对day7——三角形和矩形】【多边形相交的面积】
链接:https://ac.nowcoder.com/acm/contest/1112/J来源:牛客网 题目描述 Bobo 有一个三角形和一个矩形,他想求他们交的面积. 具体地,三角形和矩形由 8 个 ...
- 2019牛客国庆集训派对day7 A 2016
链接:https://ac.nowcoder.com/acm/problem/52800来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K ...
- 2019牛客国庆集训派对day1(A, B E F K)
链接:https://ac.nowcoder.com/acm/contest/1099#question A:可知符合条件的图中间肯定存在一个由1构成的矩形,找到由1构成矩形的边界,判断出现的1的数量 ...
- 牛客国庆集训派对Day3 B Tree
Tree 思路: 树形dp 注意0不存在逆元,任何一个数乘以0就变成0了,就没有价值浪,所以要暴力转移 代码: #pragma GCC optimize(2) #pragma GCC optimize ...
- 牛客国庆集训派对Day3 I Metropolis
Metropolis 思路: 多源点最短路 只要两个不同源点的最短路相遇,我们就更新两个源点的答案 代码: #pragma GCC optimize(2) #pragma GCC optimize(3 ...
- 牛客国庆集训派对Day3 A Knight
Knight 思路: bfs打表找规律 如下图 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(4) ...
随机推荐
- 怎么看系统是UEFI还是Legacy BIOS启动模式?
在命令行 cmd 中输入 msinfo32 ,找到右侧[BIOS模式],看到这里显示的是[uefi],那么说明是[uefi]方式启动的,反之显示为[BIOS],那么就是传统[BIOS]启动模式.如下 ...
- react 中 Modal 多次使用且带参数不同实现
一.举例:对于 echatrs 的柱子分别需要弹窗 带参数 触发弹窗出现事件 showModalhref myChart.on('click', (params) => { switch (pa ...
- Java四种权限修饰符 在创建类中的使用
四种权限修饰符 Java中有四种权限修饰符 public > protected > (default) >private 同一个类(我自己) YES YES YES YES同一个包 ...
- RabbitMQ 的消息持久化与 Spring AMQP 的实现剖析
文章目录 1. 原生的实现方式 2. Spring AMQP 的实现方式 要从奔溃的 RabbitMQ 中恢复的消息,我们需要做消息持久化.如果消息要从 RabbitMQ 奔溃中恢复,那么必须满足 ...
- 示例:自定义WPF底层控件UI库 HeBianGu.General.WpfControlLib V2.0版本
原文:示例:自定义WPF底层控件UI库 HeBianGu.General.WpfControlLib V2.0版本 一.目的:封装了一些控件到自定义的控件库中,方便快速开发 二.实现功能: 基本实现常 ...
- 32、flex布局
html: <div class="parent"> <div class="son">1</div> <div cl ...
- Java JDBC 数据源
数据源有2种: 普通数据源 即数据库驱动自带的数据源 连接池 包括数据库驱动自带的连接池,以及DBCP.C3P0等常用的第三方连接池. 数据库驱动自带的数据源 //从propertie ...
- .NET编译问题汇总
1.Your project.json doesn't list 'win' as a targeted runtime. You should add '"win": { }' ...
- windows自动化-脚本案例
; Script Start - Add your code below here Run("D:\Navicat Premium\navicat.exe") Sleep(1000 ...
- java中的强引用、软引用、弱引用、虚引用
1.强引用(Strong Reference):指程序代码中普遍存在的,类似“Object obj = new Object()”这类的引用,只要对象存在强引用关联,JVM必定不会回收这个对象: 2. ...