Advertisement
Guest User

Solución BOOKS (LASORSA)

a guest
Nov 24th, 2017
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.91 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <bitset>
  4. using namespace std;
  5. /**
  6. Pensando un poco el problema cabe observar la siguiente propiedad para s =/= 0:
  7. Si s solo pertenece a un ciclo que empieza y termina en s, entonces puede verse todo el vector
  8. como dos problemas con s = 0 (Dado que uno sería con s al inicio y otro con s al final, que a nivel práctico
  9. es lo mismo)
  10. Si, por el contrario, si hay un ciclo que incluye elementos antes y después de s, entonces se aplica la misma
  11. lógica que para los demás ciclos.
  12. Por tanto, la siguiente solución estimo resuelve todo el problema.
  13. **/
  14. int abs(int x)
  15. {
  16. if(x>0)
  17. return x;
  18. return -x;
  19. }
  20. void Ciclo(bitset<1000000> & u, bitset<1000000> & ini ,bitset<1000000> & fin, vector<int> & p, int inicio)
  21. {
  22. int i = inicio, mini = inicio, maxi = inicio;
  23. i = p[i];
  24. u[inicio] = true;
  25. while(i!=inicio)
  26. {
  27. if(i<mini)
  28. mini = i;
  29. else if(i>maxi)
  30. maxi = i;
  31. u[i] = true;
  32. i = p[i];
  33. }
  34. ini[mini] = true, fin[maxi] = true;
  35. }
  36. int books(vector<int> p, int s)
  37. {
  38. bitset<1000000> used, ini, fin;
  39. used.reset(),ini.reset(),fin.reset();
  40. int L = p.size(), ret = 0;
  41. int inicio = 0;
  42. while(p[inicio] == inicio && inicio<s)
  43. inicio++;
  44. while(p[L-1]==L-1 && L>s+1)
  45. L--;
  46. for(int i = inicio;i<L;i++)
  47. {
  48. if(used[i] == false)
  49. Ciclo(used,ini,fin,p,i);
  50. ret += abs(i-p[i]);
  51. }
  52. int cantAb = 0;
  53. for(int i = inicio;i<L;i++)
  54. {
  55. if(cantAb == 0)
  56. ret+=(i>inicio);
  57. if(ini[i])
  58. cantAb++;
  59. if(fin[i])
  60. cantAb--;
  61. if(cantAb == 0)
  62. ret+=(i<L-1);
  63. }
  64. return ret;
  65. }
  66. int main()
  67. {
  68. int n,s;
  69. cin>>n>>s;
  70. vector<int> vec(n);
  71. for(int i = 0;i<n;i++)
  72. cin>>vec[i];
  73. cout<<books(vec,s)<<endl;
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement