P1198 [JSOI2008] Máxima (base del árbol segmento)

P1198 [JSOI2008] El número máximo de

título Descripción

Ahora se solicitará a mantener un número de columnas, se requiere de las dos acciones siguientes:

1, la operación de consulta.

sintaxis:Q L

Función: el número máximo de consultas en el final de la serie de columnas en el número actual de L, y emite el valor de este número.

Restricciones: L L no excede la longitud de la secuencia actual. (L> 0) ( L > 0 )

2, la operación de inserción.

sintaxis:A n

Función: n- n-plus T T, donde T T es la respuesta a la última operación de consulta (si no está ya realizado una operación de consulta, entonces T = 0 T = 0), y el resultado de una constante fija D D tomada morir, la respuesta resultante insertado al final del número de columnas.

Restricciones: n- n enteros (posiblemente negativo) y en todo el rango de longitud.

Nota: El número de columnas está inicialmente vacía, no un número.

Formato de entrada

La primera línea de dos números enteros, M M y D D, donde M M representa el número de operaciones (M \ Le 200000) ( M 2 0 0 , 0 0 0 ), D D descrito anteriormente, satisfaciendo (0 < D <2000000000) ( 0 < D < 2 , 0 0 0 , 0 0 0 , 0 0 0 )

Los próximos M M filas, cada fila una cadena que describe una operación específica. Sintaxis como se describe anteriormente.

Formato de salida

Para cada consulta, debe activar la salida de la orden, y cada fila de resultados.

entrada y salida de la muestra

Entrada # 1
5 100 
A 96 
Q 1 
A 97 
Q 1 
Q 2
Salida # 1
96 
93 
96

Descripción / Consejos

[JSOI2008]

Esta pregunta se ha fortalecido de datos

 

Solución: Para la base línea de árboles ...... aprendiendo árbol de segmento para que la gente se abren sobre las ideas sobre las que escribir. De acuerdo con el tema que podemos cambiar la suma máxima de segmento del segmento, por lo que muchos simplemente rápido, códigos específicos a continuación;

#define _CRT_SECURE_NO_DepRECATE
 #define _CRT_SECURE_NO_WARNINGS 
# include <cstdio> 
#include <iostream> 
#include <math> 
#include <iomanip> 
#include < string > 
#include <algoritmo> 
#include <bitset> 
#include <cstdlib> 
#include <cctype > 
#include <iterador> 
#include <vector> 
#include <cstring> 
#include <cassert> 
#include <mapa> 
#include <cola>
# include <conjunto > 
#include <pila>
 #define ll largo largo
 #define INF 0x3f3f3f3f
 #define ld largo doble
 const ld pi = Acos (- 1 . 0L ), eps = 1E- 8 ;
int qx [ 4 ] = { 0 , 0 , 1 , - 1 }, qy [ 4 ] = { 1 , - 1 , 0 , 0 }, Qxx [ 2 ] = { 1 , - 1 }, qyy [ 2 ] = { 1 , -. 1 };
 el uso de  espacio de nombres STD;
 struct nodo 
{ 
    LL L = 0 , R & lt = 0 , SUM = 0 , PLZ = 0 , MLZ = 1. ; 
} Árbol [ 1000000 ]; 
LL P = INF, Maxx; 
inline void Build ( int I , int L, int R & lt, int insertar, int NUM) // ID árbol de más a la izquierda los valores de inserción más a la derecha en subíndice 
{ 
    árbol [I] .L = L; 
    árbol [I] .R =r;
    si (l == r) // 找到该点即替换为inserto 
    { 
        árbol [i] .sum = inserto; 
    } 
    Más 
    { 
        si ((l + r) / 2 > = num) 
        { 
            build (i << 1 , l, (l + r) / 2 , insertar, num); 
        } 
        Más 
        { 
            build (i << 1 | 1 , (l + r) / 2 + 1 , r, insertar, num); 
        } 
        Árbol [i] .sum = max (árbol [i << 1] .Sum, Árbol [I << 1. | 1. ] .Sum); // suma máxima de cada segmento de línea 
    } 
} 
inline LL SEARCH_MAX ( int I, int L, int R & lt) 
{ 
    IF (Árbol [ I] .L> Tree && = L [I] .r <= R & lt) // porque el valor máximo de los cuales representa la suma del segmento, el segmento está totalmente contenida por lo que encontrar puede ser devuelto directamente resumir 
    {
         regreso Árbol [I] .sum; 
    } 
    SI (Árbol [I] .L> || R & lt Árbol [I] .r < L) 
    { 
        retorno  0 ; 
    } 
    LL ANS = - INF;
     SI (L <= Árbol [I << . 1 ] .r) 
    {
        ans = max (ans, search_max (i << 1 , l, r)); 
    } 
    Si (r> = árbol [i << 1 | 1 ] .l) 
    { 
        ans = max (ans, search_max (i << 1 | 1 , l, r)); 
    } 
    Devolver ans; 
} 
Int main () 
{ 
    ios :: sync_with_stdio ( falsa ); 
    cin.tie ( 0 ); 
    ll m, d, t = 0 , suma = 1 , b, de entrada;
    Char x; 
    cin >> m >> d;
    para( Int I = 0 ; I <m; I ++ ) 
    { 
        CIN >> X;
         SI (X == ' A ' ) 
        { 
            CIN >> de entrada; 
            ENTRADA = (INPUT + T)% D; 
            Build ( . 1 , . 1 , m , INPUT, SUM); // debido a m sólo puede inserto, puede ser directamente en m R ^ 
            SUM ++ ; 
        } 
        la otra cosa 
        { 
            CIN >> B; 
            T = SEARCH_MAX ( . 1, Suma - b, suma - 1 ); 
            cout << t << endl; 
        } 
    } 
    Volver  0 ; 
}

 

Supongo que te gusta

Origin www.cnblogs.com/Load-Star/p/12670810.html
Recomendado
Clasificación