1094 和为k的连续区间

思路:看到连续区间和就要想到预处理前缀和!然后利用map记录暴力搜索就可以了

 1 #include <iostream>
 2 #include <queue>
 3 #include <stack>
 4 #include <cstdio>
 5 #include <vector>
 6 #include <map>
 7 #include <set>
 8 #include <bitset>
 9 #include <algorithm>
10 #include <cmath>
11 #include <cstring>
12 #include <cstdlib>
13 #include <string>
14 #include <sstream>
15 #include <time.h>
16 #define x first
17 #define y second
18 #define pb push_back
19 #define mp make_pair
20 #define lson l,m,rt*2
21 #define rson m+1,r,rt*2+1
22 #define mt(A,B) memset(A,B,sizeof(A))
23 #define mod 1000000007
24 using namespace std;
25 typedef long long LL;
26 const double PI = acos(-1);
27 const int N=1e4+10;
28 const int inf = 0x3f3f3f3f;
29 const LL INF=0x3f3f3f3f3f3f3f3fLL;
30 LL sum[N],a[N];
31 map<LL,LL> Q;
32 int main()
33 {
34 #ifdef Local
35     freopen("data.txt","r",stdin);
36 #endif
37     int flag=0,z,y;
38     LL n,k;
39     cin>>n>>k;
40     mt(sum,0);
41     for(int i=1;i<=n;i++)
42     {
43         cin>>a[i];
44         sum[i]=sum[i-1]+a[i];
45         Q[sum[i]]++;
46     }
47     for(int i=0;i<=n;i++)
48     {
49         if(Q[sum[i]+k])
50         {
51             for(int j=i;j<=n;j++)
52             {
53                 if(sum[j]-sum[i]==k)
54                 {
55                     cout<<i+1<<" "<<j<<endl;
56                     flag=1;
57                     break;
58                 }
59             }
60         }
61         if(flag)break;
62     }
63     if(!flag)puts("No Solution");
64 #ifdef Local
65     cerr << "time: " << (LL) clock() * 1000 / CLOCKS_PER_SEC << " ms" << endl;
66 #endif
67 }
View Code
原文地址:https://www.cnblogs.com/27sx/p/6298337.html