hdu-5183(set &&hash)

来源:互联网 发布:网络编码器 编辑:程序博客网 时间:2024/04/28 16:03
题意:问是否存在 NP−sum(i,j)=ai−ai+1+ai+2-...+(−1)j−iaj(即+ - + -),和等于k
(i,j)区间的和可以由sum[j]-sum[i-1]求得。
所以可以用哈希思想,从n~1倒序将sum[i]标记,判断sum[i-1]+k是否存在
注意:1.因为是交替加减,所以当i%2==0时判断sum[i-1]-k

   ***2.因为hash存储范围太大,用set容器来实现哈希存储

/*题意:问是否存在 NP−sum(i,j)=ai−ai+1+ai+2-...+(−1)j−iaj(即+ - + -),和等于k(i,j)区间的和可以由sum[j]-sum[i-1]求得。所以可以用哈希思想,从n~1倒序将sum[i]标记,判断sum[i-1]+k是否存在注意:1.因为是交替加减,所以当i%2==0时判断sum[i-1]-k   ***2.因为hash存储范围太大,用set容器来实现哈希存储*/#include <cstdio>#include <cstring>#include<iostream>#include<map>#include<string>#include <set>#include<string.h>using namespace std;#define ll long longconst int N=1e6+5;ll f[N];ll sum[N];set<ll> ss;int main(){    int T;    int n,k;    cin>>T;    for(int t=1;t<=T;t++)    {        scanf("%d%d",&n,&k);        memset(sum,0,sizeof(sum));        ss.clear();        for(int i=1;i<=n;i++)        {            scanf("%I64d",&f[i]);            sum[i]=sum[i-1]+(i%2?f[i]:-f[i]);        }        bool b=false;        //ss.insert(sum[n]);        for(int i=n;i>=1;i--)        {            if(b) break;            ss.insert(sum[i]);            if(i%2){                if(ss.find(sum[i-1]+k)!=ss.end()) b=true;            }            else if(ss.find(sum[i-1]-k)!=ss.end()) b=true;        }        printf("Case #%d: ",t);        if(b) printf("Yes.\n");        else printf("No.\n");    }    return 0;}


0 0