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

时间限制: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 pfprintf#define bugpf("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;}

既有美妙的风景,也会有称不上景、只有风的地方。

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

相关文章:

你感兴趣的文章:

标签云: