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;
}

浙公网安备 33010602011771号