cf1141 F2. Same Sum Blocks (Hard)(stl,暴力,贪心)

题意:

从数组中取一些不相交(不必紧邻)的区间,每个区间内的数之和相等。输出区间数最大的方案。

n <= 1500,时间3s

思路:

mp[sum] 按右端点从小到大存储所有和为sum的区间。对每个sum,贪心求最大不相交区间数。

#include <bits/stdc++.h>
using namespace std;
const int N = 1505;
int n, a[N];
struct SEG {int l, r; };
map<int, vector<SEG> > mp;

signed main()
{
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) scanf("%d", &a[i]);

    for(int r = 1; r <= n; r++)
    {
        int sum = 0;
        for(int l = r; l >= 1; l--)
            sum += a[l], mp[sum].push_back({l, r});
    }

    vector<SEG> ans;
    for(pair<const int, vector<SEG> > &mp_element : mp) //遍历mp
    {
        vector<SEG> &seg_vec = mp_element.second;
        //不是特别无聊的话建议全部auto
        vector<SEG> now; int r = 0;
        for(SEG seg : seg_vec)
            if(seg.l > r) now.push_back(seg), r = seg.r;

        if(now.size() > ans.size()) ans = now;
    }

    printf("%d\n", ans.size());
    for(SEG seg : ans) printf("%d %d\n", seg.l, seg.r);

    return 0;
}

posted @ 2021-12-19 18:09  Bellala  阅读(57)  评论(0)    收藏  举报