一整数数列a1, a2, ... , an(有正有负),以及另一个整数k,求一个区间[i, j],(1 <= i <= j <= n),使得a[i] + ... + a[j] = k。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Node
{
long long int val;
int index;
Node(long long int v, int in)
{
val = v;
index = in;
}
};
int input[10002];
bool comp(const Node &left, const Node &right)
{
if (left.val == right.val)
{
return left.index < right.index;
}
return left.val < right.val;
}
void fun(int *input, int N, int K)
{
long long int sum[N];
sum[0] = input[0];
vector<Node> a(N, Node(0,0));
a[0].val = input[0];
a[0].index = 0;
if (sum[0] == K)
{
cout << 1 << " " << 1 << endl;
return;
}
for (int i = 1; i < N; i++)
{
sum[i] = sum[i-1] + input[i];
if (sum[i] == K)
{
cout << 1 << " " << i+1 << endl;
return;
}
a[i].val = sum[i];
a[i].index = i;
}
sort(a.begin(), a.end(), comp);
for (int i = 0; i < N; i++)
{
int left = 0;
int right = N-1;
while (left < right-1)
{
int mid = left + (right-left)/2;
if (a[mid].val - sum[i] + input[i]>= K)
{
right = mid;
}
else
{
left = mid;
}
}
if (a[left].val - sum[i] + input[i] == K && a[left].index >= i)
{
cout << i+1 << " " << a[left].index+1 << endl;
return;
}
else if (a[right].val - sum[i] + input[i] == K && a[right].index >= i)
{
cout << i+1 << " " << a[right].index+1 << endl;
return;
}
while (right < N && a[right].val - sum[i] + input[i] == K)
{
if (a[right].index >= i)
{
cout << i+1 << " " << a[right].index+1 << endl;
return;
}
right++;
}
}
cout << "No Solution" << endl;
}
int main()
{
int N;
long long int K;
cin >> N >> K;
int a;
for (int i = 0; i < N; i++)
{
cin >> a;
input[i] = a;
}
fun(input, N, K);
return 0;
}