Codeforces1141F_Same Sum Blocks
题意
给定一个序列,求最多的不相交区间满足区间和相同。
分析
- 从暴力的角度想,是枚举区间再求和,反过来想,直接记录每个和对应是那些区间,然后排个序求最大不相交即可。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1550;
int n;
ll a[N],p[N];
vector<pair<int,int>> ans,t;
map<ll,vector<pair<int,int>>> mp;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
p[i]=p[i-1]+a[i];
}
for(int l=1;l<=n;l++){
for(int r=l;r<=n;r++){
ll s=p[r]-p[l-1];
mp[s].push_back({r,l});
}
}
for(auto mx:mp){
auto v=mx.second;
int siz=v.size();
sort(v.begin(),v.end());
int tmp=0;
int lst=0;
for(int i=0;i<siz;i++){
if(v[i].second>lst){
lst=v[i].first;
tmp++;
}
}
if(tmp>ans.size()){
ans.clear();
lst=0;
for(int i=0;i<siz;i++){
if(v[i].second>lst){
lst=v[i].first;
ans.push_back({v[i].second,v[i].first});
}
}
}
}
int siz=ans.size();
printf("%d\n",siz);
for(int i=0;i<siz;i++){
printf("%d %d\n",ans[i].first,ans[i].second);
}
return 0;
}