思路:维护一下前缀和,从后往前向set里面插入前缀和,然后查找sum[i-1]+(-1)i+1*k在不在set里面。
代码(快读+set):
1466ms险过,用hash表应该快一点。
#include#include #include #include #include #include using namespace std;#define ll long long#define pb push_back#define mem(a,b) memset(a,b,sizeof(a)) inline int read(){ int s=0,w=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-')w=-1;ch=getchar();} while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar(); return s*w; } const int N=1e6+5;ll a[N];ll sum[N]={ 0};set s;int main(){ /*ios::sync_with_stdio(false); cin.tie(0);*/ int t,cnt=0; scanf("%d",&t); while(t--) { cnt++; int n,k; scanf("%d %d",&n,&k); getchar(); for(int i=1;i<=n;i++)a[i]=read(); for(int i=1;i<=n;i++)sum[i]=sum[i-1]+(i%2?a[i]:-a[i]); /*for(int i=1;i<=n;i++)cout< <<' '; cout< =1;i--) { s.insert(sum[i]); if(i&1) { if(s.find(sum[i-1]+k)!=s.end()) { f=true; break; } } else { if(s.find(sum[i-1]-k)!=s.end()) { f=true; break; } } } printf("Case #%d: ",cnt); if(f)puts("Yes."); else puts("No."); s.clear(); } return 0;}