标签:set map
给定一个数组,判断数组内是否存在一个连续区间,使其和恰好等于给定整数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; }
九度 OJ 1554:区间问题 (set +前缀 +map)
标签:set map
原文地址:http://blog.csdn.net/u014737310/article/details/44342127