和为k的连续区间

来源:互联网 发布:3m净水器淘宝 编辑:程序博客网 时间:2024/05/22 10:29

一整数数列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;}


0 0