Advertisement
Guest User

Untitled

a guest
Jul 6th, 2015
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.79 KB | None | 0 0
  1. // Linhas Cruzadas - F1PJ - OBI 2015
  2. // Rogério Júnior
  3. // Complexidade: O(n*log(n))
  4.  
  5. #include <cstdio> // scanf e printf
  6.  
  7. #define MAXN 100100 // defino o limite de n
  8.  
  9. typedef long long int lli; // defino o tipo lli como long long int
  10.  
  11. int n, vetor[MAXN], aux[MAXN]; // declaro as variáveis e vetores que vamos usar
  12.  
  13. lli merge_sort(int ini, int fim){ // declaro a função merge_sort, que agora retorna um int
  14.  
  15. if(ini==fim) return 0; // se o intervalo tiver um único elemento, ele não tem inversões
  16.  
  17. // caso o contrário, declaro a variável invers, que começa com a soma das inversões das duas metades
  18. lli invers=merge_sort(ini, (ini+fim)/2) + merge_sort((ini+fim)/2+1, fim); // observe que chamei a recursão e ordenei as metades
  19.  
  20. int tam=0, j=(ini+fim)/2+1; // declaro tam e j, como feito no código anterior do merge_sort
  21.  
  22. for(int i=ini; i<=(ini+fim)/2; i++){ // para cada posição da metade da esquerda
  23.  
  24. while(j<=fim && vetor[j]<vetor[i]){ // procuro os elementos da metade da direita menores que i
  25.  
  26. // os adiciono ao vetor aux
  27. aux[tam]=vetor[j];
  28. tam++;
  29. j++; // passo para o próximo elemento
  30. invers+=(ini+fim)/2-i+1; // e adicino o número de inversões em metades diferentes com o elemento j
  31. }
  32.  
  33. // adiciono o elemento i
  34. aux[tam]=vetor[i];
  35. tam++;
  36. }
  37.  
  38. // adiciono o resto dos elementosda segunda metade
  39. while(j<=fim){
  40.  
  41. aux[tam]=vetor[j];
  42. tam++;
  43. j++;
  44. }
  45.  
  46. for(int i=ini; i<=fim; i++) vetor[i]=aux[i-ini]; // e troco os valores do vetor original pelos ordenados
  47.  
  48. return invers; // retorno o número de inversões calculado
  49. }
  50.  
  51. int main(){
  52.  
  53. scanf("%d", &n); // leio o valor de n
  54.  
  55. for(int i=1; i<=n; i++) scanf("%d", &vetor[i]); // leio os valores do vetor
  56.  
  57. printf("%lld\n", merge_sort(1, n)); // imprimo a quantidade de inversões do vetor
  58.  
  59. return 0;
  60. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement