分析:
前缀和 枚举两端就可
A
C
AC
AC
优化 先把前缀和存起来 因为
s
u
m
r
−
s
u
m
l
−
1
=
k
sum_r-sum_{l-1}=k
sumr−suml−1=k 枚举左端点时 可以先看是否出现过 再去枚举右端点
然后发现连
b
i
t
s
e
t
bitset
bitset都不行 只能用
m
a
p
map
map了!!!
CODE:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<map>
#define reg register
using namespace std;
typedef long long ll;
const int N=1e4+5;
int n,k,a[N];
ll sum[N];
bool ok;
map<ll,bool> vis;
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];
vis[sum[i]]=1;
}
for(reg int i=1;i<n;i++)
{
if(!vis[sum[i-1]+k]) continue;
for(reg int j=i+1;j<=n;j++)
if(sum[j]-sum[i-1]==k)
{
printf("%d %d",i,j);
ok=1;
return 0;
}
}
if(!ok) puts("No Solution");
return 0;
}