Biblioteca de funciones de estructura de árbol C
Montón: establecido en stl, make_heap, etc.
Árbol normalizado:
//
#include lt;algorithmgt;
usando el espacio de nombres std;
# definir MN (100005)
estructura nodo
{
int l, r
}seg[4*MN];
int n;
int data[26][MN];
//Datos colocados en datos[0][1.
void build(int l, int r, int dex, int nivel)
{
seg[dex].l=l
seg[; dex].r=r;
if(l==r){
datos[nivel] [l]=datos[0][l];
retorno;
}
int mid[0][1 .
int mid = ( l r ) / 2
build(l, mid, dex * 2, nivel 1);
build( mid 1, r, dex * 2 1, nivel 1)
int i = l, j; = mid 1, k = l;
while( i lt; = mid amp; amp; j lt; = r )
{
if(data [nivel 1][i] lt; = datos[nivel 1][j]) //Definición de clasificación
datos[nivel][k] = datos[nivel 1][i]; p> p>
else//Se puede encontrar el orden inverso cnt =mid-i 1;
data[level][k] = data[level 1][j];
}
while(i lt; = mid)datos[nivel][k] = datos[nivel 1][i]
while(j lt; = r)datos [nivel][k] = datos[nivel 1][j];
}
// consulta(1, c, l, r, 1),
int query(int root, int c, int l, int r, int dep)//(log n)^2
{
int mid= (seg[ raíz].l seg[raíz].r)/2
if(l==seg[raíz].l amp; amp; r==seg[raíz].r)
{
int * p=lower_bound(amp; datos[dep][l], amp; datos[dep][r] 1,
return ( p-amp; data[dep][l]); //devuelve el número de números menores que c en el segmento de intervalo [l, r]
//int *p=uppe
r_bound(amp; datos[dep][l], amp; datos[dep][r] 1, c
//devolver datos[dep][r] 1-p);/ /devuelve el número mayor que c en el segmento de intervalo [l, r]
}
if(rlt;=mid||lgt;=mid 1)return query(root *2 (lgt;=mid 1?1:0),c,l,r,dep 1);
else return query(root*2,c,l,mid,dep 1) query( root*2 1, c, mid 1, r, dep 1);
}
////pku 2104
Árbol sesgado a la izquierda:
p>//
#include lt;iostreamgt;
usando el espacio de nombres std;
typedef int Elem;
struct Leftnode
{
Elem e;
int dist;
Leftnode *lson, *rson;
Leftnode(Elem ee){dist=0; e=ee; lson=rson=NULL;}
} // El puntero es la raíz del árbol vacío==NULL
Leftnode * Merge(Leftnode *A, Leftnode *B)
{/Después de devolver *A, *B son inútiles pero no están vacíos
if (A==NULL ) devolver B;
si (B==NULL) devolver A;
si (A-gt; egt; B-gt; e)intercambiar (A, B); /montón mínimo p>
A-gt; rson==NULL||A-gt; rsongt; distlt; A -gt; rson -gt; dist)intercambiar (A-gt; lson, A-gt; rson); ; dist=-1 1; //dis NULL: -1
else A-gt; dist=A-gt; >
}
inserción nula (Elem ee, Leftnode *amp; root)//referencia del puntero de nota
{
Leftnode *tp=new Leftnode (ee);
root=Merge(root, tp);
}
bool delmin(Elem & ee, Leftnode * & root) // Presta atención a las referencias de puntero
{
if(root==NULL)return false;
ee=root-gt;e;
root=Fusionar (root-gt; también
n, root-gt; rson);
devuelve verdadero;
}
//hdu 1512