题意就不说了
我们知道每一种分法的值都相同 那么最多也就 n^2个区间 我们用map根据值把他们放进vector 因为题目要输出l和r所以我们的vector里面的元素也是 l和r 然后我们就暴力遍历每一个值 根据贪心策略 求出最多的不相交区间数就行了
#include<bits/stdc++.h>
using namespace std;
const int N = 1502;
typedef long long ll;
ll a[N],sum[N];
#define pa pair<int,int>
#define fi first
#define se second
map<ll,vector<pa>>mp;
vector<pa>ans;
bool cmp(pa a,pa b){
return a.se<b.se;
}
int main(){
int n;
scanf("%d",&n);
for(int i = 1; i <= n; i++) scanf("%lld",&a[i]),sum[i]=sum[i-1]+a[i];
for(int i = 1; i <= n; i++)
for(int j = i; j <= n; j++){
mp[sum[j]-sum[i-1]].push_back(make_pair(i,j));
}
int k = -1;
for(auto v:mp){
vector<pa>&s = v.se;
vector<pa>now;
sort(s.begin(),s.end(),cmp);
int ct = 0,las = -1;
for(int i = 0; i < s.size(); i++){
if(s[i].fi>las) {
ct++,las=s[i].se,now.push_back(s[i]);
}
}
if(k<ct) k=ct,ans=now;
}
printf("%d\n",k);
for(auto v:ans) printf("%d %d\n",v.fi,v.se);
return 0;
}