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
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.
See the sample for more details.
2 1 1 1 2 1 -1 0
Case #1: Yes. Case #2: No.HintIf input is huge, fast IO method is recommended.
题目链接: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");
}
}