UCF concours de programmation locale 2018 titre E (+ Fenwick arbre de commande DSF)

Si cette question n'est pas une limite, il est un tableau arborescente + dfs nue séquence de titre

La première demande pourrait être source de confusion, ce qui entraîne la contribution dynamique souhaitée, si elle modifie dynamiquement l'arbre, la séquence dfs puis va certainement changer, difficile à maintenir, et les données est importante, la violence devrait être T

Par conséquent, souhaiter à tous les noeuds terminé premier, de sorte que la séquence ne sera plus nécessaire de DSF, et pour la première opération

Nous avons juste besoin de cette position moins la somme de l'ordre de boun devant lui, et en mesure de revenir à cette après +, donc il y a ce point à modifier, et est devenu un nouveau point, ce qui équivaut aux besoins de l'opération

#include <iostream> 
#include <cstdio> 
#include <cmath> 
#include <algorithme> 
#include < string > 
#include <cstring> 
#include <map> 
#include < set >
 en utilisant l'  espace de noms std; 
typedef longue  longue ll;
const  int N = 1e6 + 10 ;
const  int inf = 0x3f3f3f3f ; 
ll tr [N]; 
ll mul [N]; 
bouns ll [N]; 
int idx;
int fois;
inth [N], E [N], ne [N], cnt = 1 ;
struct noeud {
     int de type;
    int id;
    int v; 
q} [N]; 
struct q {
     int st;
    int ed; 
} pos [N]; 
vide add ( int a, int b) { 
    e [idx] = b, ne [idx] = h [a], h [a] = idx ++ ; 
} 
Vides dfs ( int u) { 
    pos [u] .ST = ++ fois;
    int i;
    pour (i = h [u]; i = - 1 ; i = ne [i]) {
         intj = e [i]; 
        dfs (j); 
    } 
    Pos [u] .ED = temps; 
} 
Int lowbit ( int x) {
     retour x et - x; 
} 
Vide add1 ( int x, ll c) {
     int i;
    pour (i = x; i <= cnt; i + = lowbit (i)) { 
        tr [i] + = c; 
    } 
} 
Ll somme ( int x) {
     int i; 
    ll res = 0 ;
    pour (i = x; i; i- = lowbit (i)) { 
        res + = tr [i];
    } 
    Retour res; 
} 
Int main () {
     int i;
    int m, s; 
    cin >> >> m s; 
    memset (h, - 1 , sizeof h);
    pour (i = 1 ; i <= m; i ++ ) { 
        scanf ( " % d " , et q [i] .type); 
        scanf ( " % d " , et q [i] .id);
        si (q [i] .type == 1 ) { 
            cnt ++ ; 
            ajouter (q [i] .id, cnt); 
            q [i] .v = Cnt; 
        } 
        Autre  si (q [i] .type == 2 || q [i] .type == 3 ) { 
            scanf ( " % d " , & q [i] .V); 
        } 
    } 
    Pour (i = 1 ; i <= cnt; i ++ ) 
        mul [i] = s; 
    dfs ( 1 );
    pour (i = 1 ; i <= m; i ++ ) {
         si (q [i] .type == 1 ) { 
            ll tmp = somme (pos [q [i] .v] .ST); 
            ADD1 (pos [q [i] .v] .ST, - tmp);
            ADD1 (pos [q [i] .v] .ST + 1 , tmp); 
        } 
        Autre  si (q [i] .type == 2 ) { 
            ll tmp = somme (pos [q [i] .id] .ST); 
            bouns [q [i] .id] + = tmp * mul [q [i] .id]; 
            mul [q [i] .id] = (ll) q [i] .v; 
            ADD1 (pos [q [i] .id] .ST, - tmp); 
            ADD1 (pos [q [i] .id] .ST + 1 , tmp); 
        } 
        Autre  si (q [i] .type == 3 ) {
             int Place1 = pos [q [i] .id] .ST;
            int Place2 =pos [q [i] .id] .ED; 
            add1 (Place1, q [i] .v); 
            add1 (Place2 + 1 , - q [i] .v); 
        } 
        Autre { 
           printf ( " % LLD \ n " , bouns [q [i] .id] + somme (pos [q [i] .id] .ST) * Mul [q [i] .id]); 
        } 
    } 
}
Afficher le code

 

Je suppose que tu aimes

Origine www.cnblogs.com/ctyakwf/p/12571191.html
conseillé
Classement