HDU 5166 árbol segmento

La alineación enemigo
TimeLimit: 2000/1000 EM (el Java / Otros) la MemoryLimit: 65536/32768 K (Java / Otros)
formato entero-IO de 64 bits:% I64d
Problema Descripción del
militar en curso rival C País A del país ejerce este momento , por lo que C Derek jefe nacional de espionaje y sus hombres comenzaron a ocupados por Tidy. Una línea de costa país dispuestos a lo largo de una línea de los campos de ingeniería N, Derek y ordenado tarea es supervisar las actividades de estos campos de ingenieros. Como resultado de algún tipo de herramientas de monitorización avanzadas, por lo que el número de ingenieros en cada cristal campamento C Unidos clara comprensión, el número de ingenieros en cada campamento es probable que se produzca el cambio, puede aumentar o disminuir la cantidad de personal, pero no pueden escapar C monitorear el país.
CIA para estudiar las tácticas del enemigo exactamente qué ejercicios, por lo que Derek ordenado para mantener el informe de un cierto período de campo de la ingeniería continua un total de cuántas personas, como Derek preguntó: "Tidy, informar inmediatamente a los tres primeros campos a muchas personas de un total de 10 campos "Tidy comenzará inmediatamente a calcular el número total de este párrafo y el informe. Pero el número de campos enemigos cambian a menudo, y Derek le pidió a cada segmento es diferente, por lo que cada vez que un Tidy tuvo que ir a un número de campos, pronto agotado, Derek para calcular la velocidad de la Tidy cada vez más insatisfecho: "! Eres un chico gordo muerto, considerada tan lento, me despida" Tidy pensé: "se hacen las cuentas a ti mismo, que es realmente un trabajo agotador me gustaría que me disparas demasiado !! "En su desesperación, ordenado tuvo que llamar a un experto en informática para ayuda rompevientos, rompevientos, dijo:" muchacho gordo muerto, hace que generalmente se llama título acm de múltiples puntos y ver múltiples puntos de libro de aritmética, ahora probó el amargo fruto de ella! "dijo ordenado:" admití el error ... ", pero rompevientos ha colgado el teléfono. Tidy muy molesto, así que realmente contará accidente, el lector inteligente, se puede escribir un programa para ayudarle a terminar el trabajo? Pero si la eficiencia de su programa no es lo suficientemente alta, Ordenado todavía se regañó Derek.
La entrada
Una primera línea de número entero T, T conjunto de datos expresados.
Los datos de la primera línea de cada una positivo número entero N (N <= 50000), hay N representa el ingeniero campos enemigos, los siguientes números enteros positivos con N, tiene el número entero positivo i ai representa el i-ésimo ai iniciar campo de la ingeniería personal (1 <= EA <= 50 ).
A continuación, cada fila tiene un comando, comando tiene cuatro formas:
ij del complemento, i, y j es un número entero positivo, denota el i-ésimo aumento campamento j personal (j no es más de 30) (1).
(2) Sub ij de, i y j es un entero positivo, denota el i-ésimo campos reducen individuos j (j no exceda de 30);
(. 3) ij consulta de, i y j son enteros positivos, i <= j, presentes para pedir el número total de i-ésimo a j-ésimo campos;
(4) final indica el final, el último comando que aparece en cada conjunto de datos;
hasta 40.000 comandos de cada dato
de salida
del i-ésimo grupo de datos, primeras salidas "Caso I:" e introducir,
para cada salida de consultas de búsqueda el número total de número entero y un retorno de carro, lo que indica un segmento de consulta, este número se mantiene dentro de int.
SampleInput
. 1
10
. 1. 5. 4. 3 2. 6. 7. 9 10. 8
. Consulta 3. 1
. El Agregar 3. 6
Consulta 2. 7
Sub 10 2
el Agregar 6. 3.
Consulta 3 10.
End
SampleOutput
Caso 1:.
. 6
33 es
59

Significado de las preguntas: calcular una sub-intervalos en las condiciones y aumentar o disminuir el número de
las ideas: la línea de árboles título de la plantilla de un solo punto actualización de intervalo de consulta
PS: a la izquierda y la versión sub-árbol derecho que escribí no bits de computación

#include <stdio.h>
#include <algorithm>

using namespace std;

const int maxn=1e5+5;

struct node
{
    int l,r,ans;///左右端点 答案
} t[maxn*4];

void build(int v,int l, int r)/// v仅是代表你递归的方向 l ,r 是区间
{
    t[v].l=l;
    t[v].r=r;
    
    if(l==r)///递归到叶节点时赋值并回溯
    {
        scanf("%d",&t[v].ans);
        return ;
    }
    
    int mid=(l+r)/2;
    build(2*v,l,mid);///向左子树建树
    build(2*v+1,mid+1,r);///向右子树建树
    
    t[v].ans=t[v*2].ans+t[v*2+1].ans;///父节点的值 是左右子节点值之和
}

int query(int v,int l,int r)/// l,r是查询的区间
{
    if(t[v].l==l&&t[v].r==r)///当该节点的区间与所查询的相同 则返回答案
        return t[v].ans;
    int mid=(t[v].l+t[v].r)/2; /// 注意这里是从结点的左右端点开始递归
    if(r<=mid)///如果想找的区间右节点比mid值还要小 说明答案在左边  往左递归
        query(2*v,l,r);
    else
    {
        if(l>mid)
            query(2*v+1,l,r);
        else
            return query(v*2,l,mid)+query(v*2+1,mid+1,r); ///存在区间横跨的话我们需要
    }
}

void update(int v,int x,int y)///x是更新的点 y是更新所加减的值
{
    if(t[v].l==t[v].r)
    {
        t[v].ans+=y;
        return ;
    }
    int mid=(t[v].l+t[v].r)/2;
    
    if(x<=mid)
        update(2*v,x,y);
    else
        update(2*v+1,x,y);
        
    t[v].ans=t[v*2].ans+t[v*2+1].ans;
}

int main()
{
    int t,n,x,y;
    char str[15];
    scanf("%d",&t);
    for(int i=1; i<=t; i++)
    {
        printf("Case %d:\n",i);
        scanf("%d",&n);
        build(1,1,n);/// v从1开始  建立1~n的树
        while(1)
        {
            scanf("%s",str);
            if(str[0]=='E')
                break;
            scanf("%d%d",&x,&y);
            if(str[0]=='Q')
            {
                printf("%d\n",query(1,x,y));
            }
            else if(str[0]=='A')
            {
                update(1,x,y);
            }
            else if(str[0]=='S')
            {
                update(1,x,-y);
            }
        }
    }
    return 0;
}

consejos: actualización y consulta utilizada de forma recursiva en el rango se utilizan propio nodo intervalo realiza en lugar de declaración de la función en la declaración de función en el final es que usted quiere encontrar la
línea de árboles se pueden utilizar para resolver un solo punto consultas una actualización de punto único intervalo de consulta intervalo actualización (perezoso) y actualizar o complejidad consulta en log (n) o menos (tan rápido ?? esencial del recorrido del hogar Ichiban) aporte es o (n) gotas gran problema 8

Publicado 54 artículos originales · ganado elogios 0 · Vistas 1230

Supongo que te gusta

Origin blog.csdn.net/weixin_44144278/article/details/99131894
Recomendado
Clasificación