HDU 5183 Negative and Positive (NP) (set + 读入外挂 乱搞)

Negative and Positive (NP)

Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

Total Submission(s): 502    Accepted Submission(s): 141

Problem Description

When given an array
(a0,a1,a2,?an?1)
and an integer K,
you are expected to judge whether there is a pair
(i,j)(0≤i≤j<n)
which makes that NP?sum(i,j)
equals to K
true. Here NP?sum(i,j)=ai?ai+1+ai+2+?+(?1)j?iaj

Input

Multi test cases. In the first line of the input file there is an integer
T
indicates the number of test cases.

In the next 2?T
lines, it will list the data for each test case.

Each case occupies two lines, the first line contain two integers
n
and K
which are mentioned above.

The second line contain (a0,a1,a2,?an?1)separated
by exact one space.

[Technical Specification]

All input items are integers.

0<T≤25,1≤n≤1000000,?1000000000≤ai≤1000000000,?1000000000≤K≤1000000000

Output

For each case,the output should occupies exactly one line. The output format is Case #id: ans, here id is the data number starting from 1; ans is “Yes.” or “No.” (without quote) according to whether you
can find (i,j)
which makes PN?sum(i,j)
equals to K.

See the sample for more details.

Sample Input

2
1 1
1
2 1
-1 0

Sample Output

Case #1: Yes.
Case #2: No.

Hint

If input is huge, fast IO method is recommended.

 

Source

BestCoder Round #32

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5183

题目大意:问是否存在(i, j,使)NP?sum(i,j)=ai?ai+1+ai+2+?+(?1)j?iaj这个东西算出来的值等于k,存在输出Yes,否则输出No

题目分析:这题时限太死,水过的,Hint里面提示用fast IO也就是读入外挂了,主要做法是处理一下前缀和,第一种是正负正,第二种是负正负,对于要求的k,我们边插边找,找的时候要分奇偶,若i为奇数,则在第一种情况中找,否则在第二种情况中找,找到就退出

#include <cstdio>
#include <cstring>
#include <set>
#define ll long long
using namespace std;
int const MAX = 1e6 + 5;
ll a[MAX], sum[MAX];
set <ll> s;

ll Scan()
{
    ll res = 0, ch, flag = 0;
    if((ch = getchar()) == '-')
        flag = 1;
    else if(ch >= '0' && ch <= '9')
        res = ch - '0';
    while((ch = getchar()) >= '0' && ch <= '9' )
        res = res * 10 + ch - '0';
    return flag ? -res : res;
}  

int main()
{
    int T, n, k;
    scanf("%d", &T);
    for(int ca = 1; ca <= T; ca++)
    {
        bool flag = false;
        s.clear();
        memset(sum, 0, sizeof(sum));
        scanf("%d %d", &n, &k);
        getchar();
        for(int i = 1; i <= n; i++)
            a[i] = Scan();
        for(int i = 1; i <= n; i++)
            sum[i] = sum[i - 1] + (i % 2 ? a[i] : -a[i]);
        for(int i = n; i > 0; i--)
        {
            s.insert(sum[i]);
            if(i % 2)
            {
                if(s.find(sum[i - 1] + k) != s.end())
                {
                    flag = true;
                    break;
                }
            }
            else
            {
                if(s.find(sum[i - 1] - k) != s.end())
                {
                    flag = true;
                    break;
                }
            }
        }
        printf("Case #%d: %s.\n", ca, flag ? "Yes" : "No");
    }
}
时间: 2024-10-06 00:41:35

HDU 5183 Negative and Positive (NP) (set + 读入外挂 乱搞)的相关文章

HDU 5183 Negative and Positive (NP) (手写哈希)

题目链接:HDU 5183 Problem Description When given an array \((a_0,a_1,a_2,?a_{n?1})\) and an integer \(K\), you are expected to judge whether there is a pair \((i,j)(0≤i≤j<n)\) which makes that \(NP?sum(i,j)\) equals to \(K\) true. Here \(NP?sum(i,j)=a_i?

hdu 5183 Negative and Positive (NP)(STL-集合【HASH】)

题意: When given an array (a0,a1,a2,?an−1) and an integer K, you are expected to judge whether there is a pair (i,j)(0≤i≤j<n) which makes that NP−sum(i,j) equals to K true. Here NP−sum(i,j)=ai−ai+1+ai+2+?+(−1)j−iaj 1≤n≤1000000,−1000000000≤ai≤1000000000

HDU 5183 Negative and Positive (NP) ——(后缀和+手写hash表)

根据奇偶开两个hash表来记录后缀和.注意set会被卡,要手写hash表. 具体见代码: 1 #include <stdio.h> 2 #include <algorithm> 3 #include <string.h> 4 using namespace std; 5 const int N = 1000000 + 10; 6 const int HASH = 1000000 + 7; 7 typedef long long ll; 8 struct hashmap

HDU 5183 Negative and Positive (NP) --Hashmap

题意:问有没有数对(i,j)(0<=i<=j<n),使得a[i]-a[i+1]+...+(-1)^(j-i)a[j]为K. 解法:两种方法,枚举起点或者枚举终点. 先保存前缀和:a1-a2+a3....+/- an 枚举起点法: 设起点为x,实际是枚举x-1,分两种情况: 1.起点x为奇,那么就看有没有a[j]-a[x-1] = K的,即a[j] = a[x-1]+K.因为奇数位置的ai数符为正. 2.起点x为偶,那么就看有没有a[j]-(-K) = a[x-1],即a[j] = a[x

hdu 5183. Negative and Positive (哈希表)

Negative and Positive (NP) Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 2177    Accepted Submission(s): 556 Problem Description When given an array (a0,a1,a2,?an−1) and an integer K, you are

[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> #includ

Negative and Positive (NP) ( Hash 维护 )

Negative and Positive (NP) Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 2846 Accepted Submission(s): 782 Problem Description When given an array (a0,a1,a2,?an?1) and an integer K, you are expec

hdu 5183(hash)

传送门:Negative and Positive (NP) 题意:给定一个数组(a0,a1,a2,?an−1)和一个整数K, 请来判断一下是否存在二元组(i,j)(0≤i≤j<n)使得 NP−sum(i,j) 刚好为K.这里NP−sum(i,j)=ai−ai+1+ai+2+?+(−1)j−iaj. 分析:根据a[i]的i为奇偶进行hash,维护两种前缀和 1)i为奇数开头:sum=a[i]-a[i+1]+a[i+2]... 2)i为偶数开头:sum=a[i]-a[i+1]+a[i+2]...

True Positive|True Negative|False Positive|False Negative

True Positive|True Negative|False Positive|False Negative 表示分类正确: True Positive:本来是正样例,分类成正样例. True Negative:本来是负样例,分类成负样例. 表示分类错误: False Positive :本来是负样例,分类成正样例,通常叫误报. False Negative:本来是正样例,分类成负样例,通常叫漏报. true positive rate = true positive / (true po