1. Arborescence: Titre: UVA1428
1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 #include < string > 5 #include <cstring> 6 #include <numeric> 7 #include <vector> 8 #include <map> 9 # inclure <queue> 10 #include < set > 11 #include <cmath> 12 using namespace std; 13 typedef long long ll; 14 paires typedef < int , int > PII; typedef pair <ll, ll> PLL; 16 17 // L' indice de l'arborescence et l'arborescence des segments de ligne sont identiques. Les indices commencent à 1. . . Cela ne doit pas aller mal. . . 18 19 const int maxn = 1e5 + 10 ; 20 21 int tree [maxn + 10 ]; // Arborescence. . . 22 int l [maxn + 10 ], r [maxn + 10 ]; 23 24 int lowbit ( int x) { // Résoudre la position du dernier 1 dans un nombre binaire. . . 25 return x & ( -x); 26 } 27 // La somme de l'arborescence est différente de l'arborescence de lignes, et la somme de l'arborescence peut être ajoutée et soustraite à chaque fois. . . 28 29 int sum ( int x) { // Notez que x est l'index de l'arborescence. . . 30 int res = 0 ; 31 while (x> 0 ) { // Trouver la valeur de seulement le dernier 1 via lowbit, il suffit de déterminer l'existence du binaire 1 puis de continuer l'opération de traversée. . . 32 res + = arbre [x]; 33 x- = lowbit (x); // ex: x = 7 Ensuite, ajoutez 6 après cela, ajoutez 4 après cela, puis x est 0, sortez de la boucle. . . Mettez fin à l'opération. . . 34 } 35 return res; // Trouvez directement la somme. . 36 } 37 38 void add ( int x, int d) { //Cette étape consiste à augmenter l'opération. . . L'opération va de la racine de l'arborescence vers le haut. . . 39 while (x < maxn) { 40 arbre [x] + = d; // Ajouter le nœud actuel. . . Il est ajouté de bas en haut. . . 41 x + = lowbit (x); // x est l'indice de l'arbre. . . 42 } 43 } 44 45 // l [i], r [i] enregistre le nombre de chiffres plus petit que les chiffres à la position i. . . 46 47 int main () { 48 int T; 49 cin >> T; 50 ll ans; 51 while (T-- ) { 52 int a [maxn]; 53 int n; 54 cin >> n; 55 pour ( int i = 1 ; i <= n; i ++ ) { 56 cin >> a [i]; 57 } 58 memset (arbre, 0 , sizeof (arbre)); 59 memset (l, 0 , taille de (l)); 60 pour ( int i = 1 ; i <= n; i ++ ) { 61 l [i] = sum (a [i]); 62 ajouter (a [i], 1 ); // 个数 均 加 一 63 } 64 memset (arbre, 0 , sizeof (arbre)); 65 memset (r, 0 , taille de (r)); 66 pour ( int i = n; i> = 1 ; i-- ) { 67 r [i] = sum (a [i]); 68 ajouter (a [i], 1 ); 69 } 70 ans = 0 ; 71 pour ( int i = 2 ; i <n; i ++ ) { 72 ans = ans + l [i] * (nr [i] -i) + r [i] * (i- 1 -l [i]); 73 } 74 cout << ans << endl; 75 } 76 77 renvoie 0 ; 78 }