[HDOJ 5183] Negative and Positive (NP) 【Hash】
题目链接:HDOJ - 5183
题目分析
分两种情况,奇数位正偶数位负或者相反。
从1到n枚举,在Hash表中查询 Sum[i] - k ,然后将 Sum[i] 加入 Hash 表中。
BestCoder比赛的时候我写了 STL map, 然后TLE...
注意: Hash负数的时候 % 了一个质数,得到的是负数还要 + Mod !!
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | #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; } |
分类:
OI题解
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· 本地部署 DeepSeek:小白也能轻松搞定!
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 从 Windows Forms 到微服务的经验教训
· 李飞飞的50美金比肩DeepSeek把CEO忽悠瘸了,倒霉的却是程序员
· 超详细,DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方Dee