您的位置:首页 > 其它

Negative and Positive (NP) (hdu 5183 set+输入外挂)

2015-03-16 17:52 726 查看


Negative and Positive (NP)

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

Total Submission(s): 2488 Accepted Submission(s): 618



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.

HintIf input is huge, fast IO method is recommended.




Source

BestCoder Round #32



Recommend

hujie | We have carefully selected several similar problems for you: 5189 5188 5185 5184 5181

题意:问有没有数对(i,j)(0<=i<=j<n),使得a[i]-a[i+1]+...+(-1)^(j-i)a[j]为K.

思路:先计算出前缀和sum,然后枚举起点,从后往前枚举起点i,若i为奇数,则看set里面有没有sum[i-1]+k;若i为偶数,则看set里面有没有sum[i-1]-k。要用到输入外挂,不知道为什么,我的代码用G++交有时能过,有时却TLE,难道还要看OJ的心情吗=。=

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#pragma comment (linker,"/STACK:102400000,102400000")
#define maxn 1005000
#define MAXN 2005
#define mod 1000000009
#define INF 0x3f3f3f3f
#define pi acos(-1.0)
#define eps 1e-6
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define FRE(i,a,b)  for(i = a; i <= b; i++)
#define FRL(i,a,b)  for(i = a; i < b; i++)
#define mem(t, v)   memset ((t) , v, sizeof(t))
#define sf(n)       scanf("%d", &n)
#define sff(a,b)    scanf("%d %d", &a, &b)
#define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
#define pf          printf
#define DBG         pf("Hi\n")
typedef long long ll;
using namespace std;

ll sum[maxn];
ll a[maxn];
ll n,k;
set<ll>s;

inline bool scan_d(ll &ret) //输入外挂
{
    char c;
    ll sgn;
    if (c=getchar(),c==EOF) return false;
    while (c!='-'&&(c<'0'||c>'9')) c=getchar();
    sgn=(c=='-')?-1:1;
    ret=(c=='-')?0:(c-'0');
    while (c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');
    ret*=sgn;
    return true;
}

int main()
{
    ll x;
    ll i,j,t,cas=1;
    scan_d(t);
    while (t--)
    {
        scan_d(n);
        scan_d(k);
        FRL(i,1,n+1)
            scan_d(a[i]);
        sum[0]=0;
        sum[1]=a[1];
        FRL(i,2,n+1)    //计算前缀和
        {
            if (i%2)
                sum[i]=sum[i-1]+a[i];
            else
                sum[i]=sum[i-1]-a[i];
        }
        s.clear();
        bool flag=false;
        for (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;
                }
            }
        }
        if (flag)
            pf("Case #%lld: Yes.\n",cas++);
        else
            pf("Case #%lld: No.\n",cas++);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: