[HDOJ 5183] Negative and Positive (NP) 【Hash】


题目链接:HDOJ - 5183

题目分析

分两种情况,奇数位正偶数位负或者相反。

从1到n枚举,在Hash表中查询 Sum[i] - k ,然后将 Sum[i] 加入 Hash 表中。

BestCoder比赛的时候我写了 STL map, 然后TLE...

注意: Hash负数的时候 % 了一个质数,得到的是负数还要 + Mod !!

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>

using namespace std;

#define Debug(x) cout << #x << " = " << x << endl

typedef long long LL;
typedef double DB;

inline int gmax(int a, int b) {return a > b ? a : b;}
inline int gmin(int a, int b) {return a < b ? a : b;}

inline void Read(int &Num) 
{
	char c = getchar();
	bool Neg = false; 
	while (c < '0' || c > '9')
	{
		if (c == '-') Neg = true;
		c = getchar();
	}
	Num = c - '0'; c = getchar();
	while (c >= '0' && c <= '9') 
	{
		Num = Num * 10 + c - '0';
		c = getchar();
	}
	if (Neg) Num = -Num;
}

const int MaxN = 1000000 + 5, Mod = 1000007;

int T, n, k;
int A[MaxN];

struct HashNode
{
	int x;
	HashNode *Next;
} HA[MaxN], *P = HA, *Hash[2][Mod + 5];

bool Find(int f, LL Num) 
{
	int HN = ((Num % Mod) + Mod) % Mod;
	for (HashNode *j = Hash[f][HN]; j; j = j -> Next)
		if (j -> x == Num) return true;
	return false;
}

void Insert(int f, LL Num) 
{
	int HN = ((Num % Mod) + Mod) % Mod;
	++P; P -> x = Num; 
	P -> Next = Hash[f][HN]; Hash[f][HN] = P;
}

int main() 
{	
	scanf("%d", &T);
	for (int Case = 1; Case <= T; ++Case) 
	{
		memset(Hash, 0, sizeof(Hash));
		P = HA;
		scanf("%d%d", &n, &k);
		for (int i = 1; i <= n; ++i) Read(A[i]);
		int Temp;
		LL Sum0, Sum1;
		Sum0 = Sum1 = 0;
		Insert(1, 0);
		bool Flag = false;
		for (int i = 1; i <= n; ++i) 
		{
			if (i & 1) Temp = -A[i];
			else Temp = A[i];
			Sum0 = Sum0 + (LL)Temp;
			Sum1 = Sum1 - (LL)Temp; 
			if (Find(0, Sum0 - (LL)k) || Find(1, Sum1 - (LL)k)) 
			{
				Flag = true;
				break;
			}
			if (i & 1) Insert(0, Sum0);
			if ((i & 1) == 0) Insert(1, Sum1);
		}
		if (Flag) printf("Case #%d: Yes.\n", Case);
		else printf("Case #%d: No.\n", Case);
	}
	return 0;
}

  

优质内容筛选与推荐>>
1、Slam(即时定位与地图构建) 知识篇
2、搭建自用VPN服务
3、C# MySQL
4、day16 面向过程编程/模块介绍/import导入模块/ from...import导入模块/循环导入问题/模块的搜索路径/区分python文件的两种用途/软件开发的目录规范
5、二进制序列化 与 XML 序列化


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号