http://codeforces.com/problemset/problem/1141/F2
This problem is given in two editions, which differ exclusively in the constraints on the number nn .
You are given an array of integers a[1],a[2],…,a[n].a[1],a[2],…,a[n]. A block is a sequence of contiguous (consecutive) elements a[l],a[l+1],…,a[r]a[l],a[l+1],…,a[r] (1≤l≤r≤n1≤l≤r≤n ). Thus, a block is defined by a pair of indices (l,r)(l,r) .
Find a set of blocks (l1,r1),(l2,r2),…,(lk,rk)(l1,r1),(l2,r2),…,(lk,rk) such that:
- They do not intersect (i.e. they are disjoint). Formally, for each pair of blocks (li,ri)(li,ri) and (lj,rj(lj,rj ) where i≠ji≠j either ri<ljri<lj or rj<lirj<li .
- For each block the sum of its elements is the same. Formally,
a[l1]+a[l1+1]+⋯+a[r1]=a[l2]+a[l2+1]+⋯+a[r2]=a[l1]+a[l1+1]+⋯+a[r1]=a[l2]+a[l2+1]+⋯+a[r2]=
⋯=⋯=
a[lk]+a[lk+1]+⋯+a[rk].a[lk]+a[lk+1]+⋯+a[rk].
- The number of the blocks in the set is maximum. Formally, there does not exist a set of blocks (l′1,r′1),(l′2,r′2),…,(l′k′,r′k′)(l1′,r1′),(l2′,r2′),…,(lk′′,rk′′) satisfying the above two requirements with k′>kk′>k .
The picture corresponds to the first example. Blue boxes illustrate blocks.
Write a program to find such a set of blocks.
Input
The first line contains integer nn (1≤n≤15001≤n≤1500 ) — the length of the given array. The second line contains the sequence of elements a[1],a[2],…,a[n]a[1],a[2],…,a[n] (−105≤ai≤105−105≤ai≤105 ).
Output
In the first line print the integer kk (1≤k≤n1≤k≤n ). The following kk lines should contain blocks, one per line. In each line print a pair of indices li,rili,ri (1≤li≤ri≤n1≤li≤ri≤n ) — the bounds of the ii -th block. You can print blocks in any order. If there are multiple answers, print any of them.
Examples
Input
7 4 1 2 2 1 5 3
Output
3 7 7 2 3 4 5
Input
11 -5 -4 -3 -2 -1 0 1 2 3 4 5
Output
2 3 4 1 1
Input
4 1 1 1 1
Output
4 4 4 1 1 2 2 3 3
思路: 跟Easy版本的解法一模一样。附一发easy题解。
https://blog.csdn.net/xiji333/article/details/88787114
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#define INF 0x3f3f3f3f
using namespace std;
typedef pair<int,int> P;
int a[1505];
vector<P> vec[2500005];
map<int,int> m;//从和到下标的映射
int sum[1505];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];
}
int k=0;
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
P p(j,i);
int dis=sum[j]-sum[i-1];
if(!m[dis])
m[dis]=++k;
int id=m[dis];
vec[id].push_back(p);
}
}
int MAX=0,idx=0;
for(int i=1;i<=k;i++)
{
int cnt=0;
int pre=0;
sort(vec[i].begin(),vec[i].end());
for(int j=0;j<vec[i].size();j++)
{
if(vec[i][j].second>pre)
{
++cnt;
pre=vec[i][j].first;
}
if(cnt>MAX)
{
MAX=cnt;
idx=i;
}
}
}
printf("%d\n",MAX);
int pre=0;
for(int i=0;i<vec[idx].size();i++)
{
if(vec[idx][i].second>pre)
{
printf("%d %d\n",vec[idx][i].second,vec[idx][i].first);
pre=vec[idx][i].first;
}
}
return 0;
}