水题,每当出现重复就分割开来,最后留下的尾巴给最后一段
#include<cstdio> #include<cstring> #include<cmath> #include<stack> #include<vector> #include<map> #include<string> #include<iostream> #include<algorithm> using namespace std; const int maxn=3*100000+10; map<int,int>m; int n; int a[maxn]; struct X { int l,r; }; vector<X>ans; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); m.clear(); int FinalRight=-1; int left=1,right=0; for(int i=1;i<=n;i++) { if(m[a[i]]==1) { m.clear(); FinalRight=i; X seg; seg.l=left; seg.r=i; ans.push_back(seg); left=i+1; } else { m[a[i]]=1; right=i; } } if(ans.size()==0) printf("-1 "); else { ans[ans.size()-1].r=n; printf("%d ",ans.size()); for(int i=0;i<ans.size();i++) printf("%d %d ",ans[i].l,ans[i].r); } return 0; }