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;
}
全部评论

相关推荐

小鹏、大疆、米哈游、MinMax小鹏上午投的下午就约面,进度未免也太快了
蛇年行大运fff:哥们 盗贴有意思吗,我发xhs上的给你搬过来了😅😅😅
点赞 评论 收藏
分享
仁者伍敌:牛子这些人还会点一个自动回复,boss都不带回复的
点赞 评论 收藏
分享
07-02 10:39
门头沟学院 Java
Steven267:说点真实的,都要秋招了,还没有实习,早干嘛去了,本来学历就差,现在知道急了,而且你这个简历完全可以写成一页,劣势太大了,建议转测试
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务