【hash】ABCDEF

ABCDEF (ABCDEF.c/cpp/pas)

【题目描述】

LazyChild有n个在[-30000,30000]区间内的整数,他想知道有多少个六元组(a,b,c,d,e,f)满足:

(a × b + c) ÷ d – e = f

【输入文件】

第一行一个整数n。

第二行n个整数。

【输出文件】

一行一个整数,表示有多少个满足要求的六元组。

【样例输入】

2

2 3

【样例输出】

4

【数据规模和约定】

对于30%的数据,1 <= n <= 10

对于100%的数据,1 <= n <= 100


朴素的六重循环。这种问题只要规模不是太大都可以通过hash来将数量级降低一半,否则用于hash计算,或者本处我采用的平衡二叉树所耗的时间将会很大。


但是因为我是个数学弱菜,移项的时候居然忘记考虑0,所以悲剧WA20。除法一定要考虑0呀,傻逼。


这里要注意,使用iterator手动操作map要比map的[]重载快得多得多。


但是还要注意,iterator一定要注意是否等于end()。否则一定会出错!


#include <cstdio>
#include <iostream>
#include <map>

using std::pair;
using std::make_pair;
using std::cout;
using std::map;

typedef long long ll;
ll ans = 0;
map<long,long> hash;
map<long,long>::iterator it1;
long num[110];

inline long getint()
{
	long rs=0;bool sgn=1;char tmp;
	do tmp = getchar();
	while (!isdigit(tmp)&&tmp-'-');
	if (tmp == '-'){tmp=getchar();sgn=0;}
	do rs=(rs<<3)+(rs<<1)+tmp-'0';
	while (isdigit(tmp=getchar()));
	return sgn?rs:-rs;	
}

int main()
{
	freopen("ABCDEF.in","r",stdin);
	freopen("ABCDEF.out","w",stdout);
	long n = getint();
	for (long i=1;i<n+1;i++)
		num[i] = getint();

	for (long i=1;i<n+1;i++)
		for (long j=1;j<n+1;j++)
			for (long k=1;k<n+1;k++)
			{
				long tmp = num[i]*num[j]+num[k];
				it1 = hash.find(tmp);
				if (it1 == hash.end())
					hash.insert(make_pair(tmp,1));
				else
					it1->second ++;
			}

	for (long k=1;k<n+1;k++)
		if (num[k] != 0)
		for (long i=1;i<n+1;i++)
			for (long j=1;j<n+1;j++)
			{
				long tmp = (num[i]+num[j])*num[k];
				//ans += hash[tmp];
				it1 = hash.find(tmp);
				if (it1 != hash.end())
					ans += it1->second;
			}
	cout << ans;
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值