fork download
  1. #include <bits/stdc++.h>
  2. #define ll long long
  3. #define sti string
  4. #define bit(n,i) ((n>>i) &1)
  5. #define itachi ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
  6. #define maxn 2000005
  7. #define fi first
  8. #define se second
  9. #define i18 __int128_t
  10.  
  11.  
  12. using namespace std;
  13.  
  14. vector<int> stair[20005];
  15. int nexttime[20005],wait[20005],n,k,a[20005],res=0;
  16.  
  17. void Receive(int i,int x){
  18. if(i<=0) return ;
  19. if(i!=0 && stair[i].size()==2){
  20. int y=(wait[stair[i][1]] > wait[stair[i][0]] ? stair[i][1] : stair[i][0]);
  21. Receive(i-1,y);
  22. }
  23. stair[i].push_back(x);
  24. return ;
  25. }
  26.  
  27. void Request(int i,int x){
  28. if(i<=0) return ;
  29. if(stair[i].size()>=1) if(x==stair[i][0]) return ;
  30. if(stair[i].size()>=2) if(x==stair[i][1]) return ;
  31. if(i!=0 && stair[i].size()==2){
  32. int y=(wait[stair[i][1]] > wait[stair[i][0]] ? stair[i][1] : stair[i][0]);
  33. if(y==stair[i][1]) stair[i].erase(stair[i].begin()+1);
  34. else stair[i].erase(stair[i].begin());
  35. Receive(i-1,y);
  36. }
  37. res++;
  38.  
  39. Request(i-1,x);
  40. stair[i].push_back(x);
  41. if(stair[i-1].size()>=1) if(stair[i-1][0]==x) stair[i-1].erase(stair[i-1].begin());
  42. if(stair[i-1].size()>=2) if(stair[i-1][1]==x) stair[i-1].erase(stair[i-1].begin()+1);
  43. return ;
  44. }
  45.  
  46. int main()
  47. {
  48. itachi
  49. cin>>n>>k;
  50. for(int i=1;i<=k;i++) cin>>a[i];
  51. for(int i=1;i<=1e4;i++) wait[i]=1e9;
  52. for(int i=k;i>=1;i--){
  53. int x=a[i];
  54. nexttime[i]=wait[x];
  55. wait[x]=i;
  56. }
  57. for(int i=1;i<=k;i++){
  58. Request(n,a[i]);
  59. wait[a[i]]=nexttime[i];
  60. }
  61. cout<<res*2;
  62. return 0;
  63. }
  64.  
Success #stdin #stdout 0.01s 5288KB
stdin
Standard input is empty
stdout
Standard output is empty