思路讲解
我是没想到这么简单就AC了
主要思路就是一直遍历,遇到完全不对的直接截断,遇到重复的把之前的去掉重新开始计数,当然有一些小的需要搞一搞的地方,比如
6
1 2 2 2 3 3
这个需要2 2 3 3
所以当步长为2往前发现不行的时候,看看可不可以回退
AC代码
https://atcoder.jp/contests/abc381/submissions/61291304
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| #include <iostream> #include <cstring> #include <algorithm> #include <deque> #include <queue> #include <vector> #include <set> #include <map> #include <cmath> #include <bitset> #include <iterator> #include <random> #include <iomanip> #include <cctype> #include <array>
using namespace std; typedef long long ll; const ll N=static_cast<ll>(2e5)+10; ll n,A[N]; ll ans;
ll pos[N];
int main() { ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); cin>>n; for(int i=1;i<=n;++i){ cin>>A[i]; } if(n==1){ cout<<0<<endl; return 0; } ll cnt=0,i=2,start=1; while(i<=n){ if(A[i-1]!=A[i]){ ans=max(ans,cnt); cnt=0; if(A[i-1]==A[i-2]){ i-=1; cnt+=2; start=i-1; }else{ i+=1; start=i-1; } }else{ if(pos[A[i]]>start){ ans=max(ans,cnt); start=pos[A[i]]+1; cnt=i-pos[A[i]]; pos[A[i]]=i; i+=2; }else if(pos[A[i]]==start){ ans=max(ans,cnt); start=pos[A[i]]; cnt=i-pos[A[i]]+1; pos[A[i]]=i; i+=2; }else{ pos[A[i]]=i; cnt+=2; i+=2; } } } ans=max(cnt,ans); cout<<ans<<endl; return 0; }
|
心路历程(WA,TLE,MLE……)