思路:看到连续区间和就要想到预处理前缀和!然后利用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 }
原文:http://www.cnblogs.com/27sx/p/6298337.html