Codeforces Round #547 (Div. 3) F2. Same Sum Blocks (Hard)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41608020/article/details/88732907

给定一个数列,求最多有多少个 不相交 并且 区间和相等 的区间。

首先枚举左右端点,然后将 n^2 个区间和相等的存到一起,按右端点的大小排序,然后考虑每一组和相等的,贪心选最多有多少个不相交的区间。

code

#include <bits/stdc++.h>
#define ll long long
using namespace std;
int a[1505], pre[1505];
map<int, int>value;
map<int, vector<pair<int, int> > >mp;
int main()
{
	int n;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++)
	{
		scanf("%d", &a[i]);
		pre[i] = pre[i - 1] + a[i];
	}
	for (int i = 1; i <= n; i++)//右端点
	{
		for (int j = 1; j <= i; j++)//左端点
		{
			int temp = pre[i] - pre[j - 1];
			if (value[temp] < j)
			{
				value[temp] = i;
				mp[temp].push_back(pair<int, int>{j, i});
			}
		}
	}
	vector<pair<int, int> > ans;
	for (auto it = mp.begin(); it != mp.end(); it++)
	{
		if (it->second.size() > ans.size())
			ans = it->second;
	}
	printf("%d\n", ans.size());
	for (int i = 0; i < ans.size(); i++)
		printf("%d %d\n", ans[i].first, ans[i].second);
}

猜你喜欢

转载自blog.csdn.net/qq_41608020/article/details/88732907