Codeforces1141F_Same Sum Blocks

  • 2019 年 10 月 22 日
  • 筆記

题意

给定一个序列,求最多的不相交区间满足区间和相同。

分析

  • 从暴力的角度想,是枚举区间再求和,反过来想,直接记录每个和对应是那些区间,然后排个序求最大不相交即可。

代码

#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("%dn",siz);      for(int i=0;i<siz;i++){          printf("%d %dn",ans[i].first,ans[i].second);      }      return 0;  }