九度 OJ 1554:区间问题 (set +前缀 +map)

来源:互联网 发布:知天下事的动物 编辑:程序博客网 时间:2024/06/05 17:39

时间限制:1 秒

内存限制:128 兆

特殊判题:

提交:3468

解决:291

题目描述:

给定一个数组,判断数组内是否存在一个连续区间,使其和恰好等于给定整数k。

输入:

输入包含多组测试用例,每组测试用例由一个整数n(1<=n<=10000)开头,代表数组的大小。
接下去一行为n个整数,描述这个数组,整数绝对值不大于100。
最后一行为一个整数k(大小在int范围内)。

输出:

对于每组测试用例,若存在这个连续区间,输出其开始和结束的位置,s,e(s <= e)。
若存在多个符合条件的输出,则输出s较小的那个,若仍然存在多个,输出e较小的那个。
若不存在,直接输出"No"。

样例输入:
5-1 2 3 -4 953-1 2 -372-1 10
样例输出:
2 3No1 2
来源:
2014年王道论坛计算机考研机试全真模拟考试





#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 100005int 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;}


1 0
原创粉丝点击