-
题目描述:
-
给定一个数组,判断数组内是否存在一个连续区间,使其和恰好等于给定整数k。
-
输入:
-
输入包含多组测试用例,每组测试用例由一个整数n(1<=n<=10000)开头,代表数组的大小。
接下去一行为n个整数,描述这个数组,整数绝对值不大于100。
最后一行为一个整数k(大小在int范围内)。
-
输出:
-
对于每组测试用例,若存在这个连续区间,输出其开始和结束的位置,s,e(s <= e)。
若存在多个符合条件的输出,则输出s较小的那个,若仍然存在多个,输出e较小的那个。
若不存在,直接输出"No"。
-
样例输入:
-
5 -1 2 3 -4 9 5 3 -1 2 -3 7 2 -1 1 0
-
样例输出:
-
2 3 No 1 2
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<set>
#include<map>
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define MID(x,y) ((x+y)>>1)
#define eps 1e-8
//typedef __int64 ll;
#define fre(i,a,b) for(i = a; i < b; i++)
#define free(i,a,b) for(i = a; i >= b;i--)
#define mem(t, v) memset ((t) , v, sizeof(t))
#define ssf(n) scanf("%s", n)
#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 bug pf("Hi\n")
using namespace std;
#define INF 0x3f3f3f3f
#define N 100005
int n;
int sum[N],k;
int a[N];
set<int>le;
map<int ,int>mp;
void solve()
{
int i,j;
le.clear();
mp.clear();
bool flag=false;
int s,e;
free(i,n,1)
{
le.insert(sum[i]);
mp[sum[i]]=i;
if(le.find(sum[i-1]+k)!=le.end())
{
s=i;
e=mp[sum[i-1]+k];
flag=true;
}
}
if(flag) pf("%d %d\n",s,e);
else pf("No\n");
}
int main()
{
int i,j,t,ca=0;
while(~scanf("%d",&n))
{
fre(i,1,n+1)
{
sf(a[i]);
sum[i]=sum[i-1]+a[i];
}
sf(k);
solve();
}
return 0;
}