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

猜你喜欢

转载自www.cnblogs.com/zxcoder/p/11723107.html