fork download
  1. program paletta;
  2. var N,i0 ,i,z, dimpari, dimdispari:Longint;
  3. V,pari, dispari, controllo: array of longint;
  4. n_ribaltamenti,numero_ribaltamenti, piccolidopo,maggioriprima,fuoriposto, ricordafuoriposto:int64;
  5. ordinabile: boolean;
  6.  
  7. function SOMMA(X:longint):int64;
  8. begin
  9. SOMMA:=0;
  10. while (X > 0) do
  11. begin
  12. SOMMA:=SOMMA+controllo[X];
  13. X:=X-(X and -X);
  14. end
  15. end;
  16. Procedure modifica(X:longint; D:longint);
  17. begin
  18. while (X <D) do
  19. begin
  20.  
  21. controllo[X]:=controllo[X]+1;
  22. X:=X+(X and -X);
  23. end
  24. end;
  25.  
  26. function paletta_sort(N: longint; V: array of longint): int64;
  27. begin
  28. if N mod 2 = 0 then begin dimpari:=N div 2; dimdispari:= dimpari; end
  29. else begin dimdispari:=N div 2 ; dimpari:= dimdispari+1; end;
  30. Setlength(pari, dimpari);
  31. Setlength(dispari, dimdispari);
  32. Setlength(controllo, N);
  33. ordinabile:=true;
  34. for z:=0 to N-1 do if V[z] mod 2 <> z mod 2 then begin ordinabile:=false; n_ribaltamenti:=-1; end;
  35. if ordinabile=true then begin
  36. for i:=0 to N do controllo[i]:=0;
  37. for i:=0 to N -1 do if i mod 2 =0 then pari[i div 2]:=V[i] div 2 ;
  38. for i:=0 to N -1 do if i mod 2 <> 0 then dispari[i div 2]:=(V[i] -1) div 2 ;
  39. i:=1; n_ribaltamenti:=0; ricordafuoriposto:=0;
  40. while i<dimpari do
  41. begin
  42. piccolidopo:=0; maggioriprima:=0; fuoriposto:=0;
  43. modifica (i, dimpari);
  44. piccolidopo:=pari[i]-somma(pari[i]);
  45. maggioriprima:=i-pari[i]+piccolidopo;
  46. fuoriposto:=maggioriprima+piccolidopo;
  47. if fuoriposto>ricordafuoriposto then ricordafuoriposto:=fuoriposto;
  48. i:=i+1;
  49. end;
  50. n_ribaltamenti:=n_ribaltamenti+ricordafuoriposto;
  51. for i:=0 to N do controllo[i]:=0;
  52. i:=1; ricordafuoriposto:=0;
  53. while i<=dimdispari do
  54. begin
  55. piccolidopo:=0; maggioriprima:=0; fuoriposto:=0;
  56. modifica (i, dimdispari);
  57. piccolidopo:=dispari[i]-somma(dispari[i]);
  58. maggioriprima:=i-dispari[i]+piccolidopo;
  59. fuoriposto:= maggioriprima+piccolidopo;
  60. if fuoriposto>ricordafuoriposto then ricordafuoriposto:=fuoriposto;
  61. i:=i+1;
  62. end;
  63. n_ribaltamenti:=n_ribaltamenti+ricordafuoriposto;
  64. end;
  65. paletta_sort:=n_ribaltamenti;
  66. end;
  67.  
  68.  
  69. begin
  70. (*assign(input, 'input.txt'); reset(input);
  71.   assign(output, 'output.txt'); rewrite(output);*)
  72. { Reading input }
  73. readln( N);
  74. Setlength(V, N);
  75. for i0 := 0 to N-1 do
  76. begin
  77. read(V[i0]);
  78. end;
  79. { Calling functions }
  80. numero_ribaltamenti := paletta_sort(N, V);
  81.  
  82. { Writing output }
  83. writeln(numero_ribaltamenti);
  84.  
  85. end.
  86.  
  87.  
  88.  
Success #stdin #stdout 0s 5284KB
stdin
6
2 3 0 5 4 1
stdout
4