Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <bitset>
- using namespace std;
- /**
- Pensando un poco el problema cabe observar la siguiente propiedad para s =/= 0:
- Si s solo pertenece a un ciclo que empieza y termina en s, entonces puede verse todo el vector
- 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
- es lo mismo)
- Si, por el contrario, si hay un ciclo que incluye elementos antes y después de s, entonces se aplica la misma
- lógica que para los demás ciclos.
- Por tanto, la siguiente solución estimo resuelve todo el problema.
- **/
- int abs(int x)
- {
- if(x>0)
- return x;
- return -x;
- }
- void Ciclo(bitset<1000000> & u, bitset<1000000> & ini ,bitset<1000000> & fin, vector<int> & p, int inicio)
- {
- int i = inicio, mini = inicio, maxi = inicio;
- i = p[i];
- u[inicio] = true;
- while(i!=inicio)
- {
- if(i<mini)
- mini = i;
- else if(i>maxi)
- maxi = i;
- u[i] = true;
- i = p[i];
- }
- ini[mini] = true, fin[maxi] = true;
- }
- int books(vector<int> p, int s)
- {
- bitset<1000000> used, ini, fin;
- used.reset(),ini.reset(),fin.reset();
- int L = p.size(), ret = 0;
- int inicio = 0;
- while(p[inicio] == inicio && inicio<s)
- inicio++;
- while(p[L-1]==L-1 && L>s+1)
- L--;
- for(int i = inicio;i<L;i++)
- {
- if(used[i] == false)
- Ciclo(used,ini,fin,p,i);
- ret += abs(i-p[i]);
- }
- int cantAb = 0;
- for(int i = inicio;i<L;i++)
- {
- if(cantAb == 0)
- ret+=(i>inicio);
- if(ini[i])
- cantAb++;
- if(fin[i])
- cantAb--;
- if(cantAb == 0)
- ret+=(i<L-1);
- }
- return ret;
- }
- int main()
- {
- int n,s;
- cin>>n>>s;
- vector<int> vec(n);
- for(int i = 0;i<n;i++)
- cin>>vec[i];
- cout<<books(vec,s)<<endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement