交易

发布时间 2023-04-05 16:04:09作者: HEIMOFA

题目描述

小B来到了一个村庄,村庄里有 \(N\) 个村民,第 \(i\) 个村民会售卖 \(ai\) 种物品,在他所售卖的所有物品中,第 \(j\) 个物品的编号是 \(sj\) ,价格是 \(pj\) 颗绿宝石,数量是 \(bj\) 。现在小B想要购买 \(M\) 种物品,第 \(i\) 种物品编号是 \(ci\) 。因为他想要购买的这些物品都是他紧缺的,所以当任何一个村民售卖这个物品时,他就会全部购买。小B想知道,他需要准备多少颗绿宝石。


输入格式

第一行输入两个整数 \(N\)\(M\)

接下来,输入 \(N\) 组数据

\(i\) 组的第一行输入 \(ai\)

\(i\) 组的接下来 \(ai\) 行,第 \(j\) 行输入 \(3\) 个整数 \(sj\) , \(pj\) , \(bj\)

接下来 \(M\) 行,第 \(i\) 行输入 \(ci\)


输出格式

一个整数,表示小B需要准备的绿宝石数


样例输入

2 1
2
3 4 1
2 1 7
1
3 5 4
3

样例输出

24

提示

对于100%的数据,保证 \(1 <= N,ai,M <= 100, 1 <= sj,ci <= 10^9, 1 <= pj,bj <= 100\)


这道题很简单,我们只需要统计每种绿宝石要是全买所需要的价钱,最后根据需要的种类累加即可

但一看数据范围,种类竟可达到 \(10^9\) 很明显作为数组下标是不行的,但是又会发现我们实际上只会用到最多 \(100\times100\) 的种类,很明显要么离散化,要么 \(map\)

这里写的 \(map\) (毕竟只要确定映射关系即可)

\(Code:\)

#include<bits/stdc++.h>
using namespace std;
int n,m;
long long ans;//不开long long见祖宗
map<int,int> mp;

int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		int k;
		scanf("%d",&k);
		for(int j=1;j<=k;j++){
			int s,p,b;
			scanf("%d%d%d",&s,&p,&b);
			mp[s]+=p*b;
		}
	}
	for(int i=1;i<=m;i++){
		int x;
		scanf("%d",&x);
		ans+=mp[x];
	}
	printf("%lld",ans);
	return 0;
}