Codeforces Round #547 (Div. 3) F 貪心 + 離散化
阿新 • • 發佈:2019-03-30
i++ lock codeforce back contest clas 大小 std con
https://codeforces.com/contest/1141/problem/F2
題意
一個大小為n的數組a[],問最多有多少個不相交的區間和相等
題解
- 離散化用值來做,貪心選擇較前的區間
代碼
#include<bits/stdc++.h> #define M 5000005 #define ll long long #define pb push_back using namespace std; struct N{int l,r;N(int l=0,int r=0):l(l),r(r){}}; int n,i,j,p,ans,cnt,u,r,sz=0; ll a[2005],b[M]; vector<N>g[M]; int main(){ cin>>n; for(i=1;i<=n;i++){ scanf("%lld",&a[i]);a[i]+=a[i-1]; for(j=i;j>=1;j--){ b[sz++]=a[i]-a[j-1]; } } sort(b,b+sz);sz=unique(b,b+sz)-b; for(i=1;i<=n;i++){ for(j=1;j<=i;j++){ p=lower_bound(b,b+sz,a[i]-a[j-1])-b; g[p].pb({j,i}); } } ans=1; for(i=0;i<sz;i++){ r=g[i][0].r;cnt=1; for(j=1;j<g[i].size();j++){ if(g[i][j].l>r){ cnt++;r=g[i][j].r; } } if(cnt>=ans){ ans=cnt;u=i; } } printf("%d\n%d %d\n",ans,g[u][0].l,g[u][0].r); r=g[u][0].r; for(i=1;i<g[u].size();i++){ if(g[u][i].l>r){ printf("%d %d\n",g[u][i].l,g[u][i].r); r=g[u][i].r; } } }
Codeforces Round #547 (Div. 3) F 貪心 + 離散化