Browse Source

add inversion

Olivier Marty 8 years ago
parent
commit
972e363866
2 changed files with 40 additions and 1 deletions
  1. 36 0
      code/Inversion.cpp
  2. 4 1
      main.tex

+ 36 - 0
code/Inversion.cpp

@@ -0,0 +1,36 @@
+// Compte les inversions dans un tableau à l'aide du tri fusion
+// renvoie le nombre total, et rempli rep pour le nombre d'inversion comprenant
+// chaque élement (à droite) -> permet de compter le nombre de triplet inversion
+// COMPLEXITY: n log n
+// pair.first: valeur de la case
+// pair.second: indice dans le tableau initialement (rep est rempli en fonction)
+typedef pair<int, int> PII;
+PII tmp[100001]; // tableau temporaire
+int rep[100001]; // réponse (doit être initialisé à 0)
+void fusion(PII *s1, PII *e1, PII *s2, PII *e2) {
+  PII *start = s1, *end = e2;
+  PII *p = tmp;
+  while(s1 < e1 && s2 < e2) {
+    if((inv && s2->first < s1->first) || (!inv && s2->first > s1->first)) {
+      rep[s2->second] += e1-s1;
+      *p = *s2; p++; s2++;
+    }
+    else
+      *p = *s1; p++; s1++;
+  }
+  while(s1 < e1) *p = *s1; p++; s1++;
+  while(s2 < e2) *p = *s2; p++; s2++;
+  for(int i = 0; i < end-start; i++) // TODO memcpy ?
+    start[i] = tmp[i];
+}
+// s: début du tableau (inclu), e: fin (exclu)
+int count_inv(PII *s, PII *e) {
+  if(s == e)
+    return;
+  if(s + 1 == e)
+    return;
+  size_t seg = (e-s)/2;
+  int rep = count_inv(s, s+seg) + count_inv(s+seg, e);
+  rep += fusion(s, s+seg, s+seg, e);
+  return rep;
+}

+ 4 - 1
main.tex

@@ -145,7 +145,7 @@ Temps de cuisson : $O(n)$
 {\scriptsize\lstinputlisting{code/SegmentTree.cpp}}
 
 \subsection{Bits Sets}
-{\scriptsize\lstinputlisting{code/BitSet.cpp}}
+{\scriptsize\lstinputlisting{code/BitSet.cpp}} % OK
 
 \section{Divers}
 
@@ -155,6 +155,9 @@ Temps de cuisson : $O(n)$
 \subsection{Maximum rectangle under an histogram / in a matrix}
 {\scriptsize\lstinputlisting{code/BiggestRectangle.cpp}}
 
+\subsection{Number of inversions}
+{\scriptsize\lstinputlisting{code/Inversion.cpp}} % OK
+
 \subsection{Dates}
 {\scriptsize\lstinputlisting{code/Dates.cc}}