题 解 CF997E 【】 Buenas subsegmentos

Transformado primer problema, nos encontramos con el ((min-max) - \ (RL) = 0 \) intervalo es el intervalo de buena.

Para el problema estadístico subintervalo esta pregunta como esta, preguntar primero, presione el extremo derecho de ordenar una solución única, fija el extremo derecho, y luego para hacer frente a una amplia gama de información a través de las estructuras de datos, consulta intervalo de consulta legítima contribución directa a barrer de nuevo el resolver todas las consultas.

Continuar para mirar en la expresión \ ((min-max) - (rl es a) = 0 \) , si se encuentra a mantener el valor de esta fórmula, para un punto del extremo derecho fijo, el extremo izquierdo de sus estadísticas anteriores puede apuntar al punto extremo derecho y el número mínimo de intervalos, el número mínimo de puntos que se deja en este rango puede contribuir al punto del extremo derecho fijo.

Pero esto sólo puede registrar un punto fijo en la respuesta correcta, la pregunta no se puede procesar sub-intervalo, se puede registrar la historia de la cantidad y el valor mínimo, a continuación, pedir es la respuesta a todas las subsecciones de esta sección.

En la implementación específica, el mantenimiento \ (max-min \) cambia monótonamente pila se puede conseguir mediante, \ (rl es una \) cambia en todo el intervalo directamente a menos uno, y el número mínimo histórico requerido por el marcado de vista variar y si se puede aportar, para ver los detalles del código.

\(código:\)

#include<bits/stdc++.h>
#define maxn 500010
#define ls (cur<<1)
#define rs (cur<<1|1)
#define mid ((l+r)>>1)
using namespace std;
typedef long long ll;
template<typename T> inline void read(T &x)
{
    x=0;char c=getchar();bool flag=false;
    while(!isdigit(c)){if(c=='-')flag=true;c=getchar();}
    while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
    if(flag)x=-x;
}
int n,q,t1,t2,root=1;
int a[maxn],s1[maxn],s2[maxn];
ll ans[maxn],mi[maxn],cnt[maxn],sum[maxn],add[maxn],tag[maxn];
struct Query
{
    int l,id;
};
vector<Query> ve[maxn];
void pushup(int cur)
{
    ll lm=mi[ls],rm=mi[rs],lc=cnt[ls],rc=cnt[rs];
    if(lm==rm) mi[cur]=lm,cnt[cur]=lc+rc;
    if(lm<rm) mi[cur]=lm,cnt[cur]=lc;
    if(lm>rm) mi[cur]=rm,cnt[cur]=rc;
    sum[cur]=sum[ls]+sum[rs];
}
void pushadd(int cur,ll v)
{
    mi[cur]+=v,add[cur]+=v;
}
void pushtag(int cur,ll v)
{
    sum[cur]+=cnt[cur]*v,tag[cur]+=v;
}
void pushdown(int cur)
{
    if(add[cur])
        pushadd(ls,add[cur]),pushadd(rs,add[cur]),add[cur]=0;
    if(tag[cur])
    {
        if(mi[cur]==mi[ls]) pushtag(ls,tag[cur]);
        if(mi[cur]==mi[rs]) pushtag(rs,tag[cur]);
        tag[cur]=0;
    }
}
void build(int l,int r,int cur)
{
    if(l==r)
    {
        mi[cur]=l,cnt[cur]=1;
        return;
    }
    build(l,mid,ls),build(mid+1,r,rs);
    pushup(cur);
}
void modify(int L,int R,int l,int r,ll v,int cur)
{
    if(L<=l&&R>=r)
    {
        pushadd(cur,v);
        return;
    }
    pushdown(cur);
    if(L<=mid) modify(L,R,l,mid,v,ls);
    if(R>mid) modify(L,R,mid+1,r,v,rs);
    pushup(cur);
}
ll query(int L,int R,int l,int r,int cur)
{
    if(L<=l&&R>=r) return sum[cur];
    pushdown(cur);
    ll ans=0;
    if(L<=mid) ans+=query(L,R,l,mid,ls);
    if(R>mid) ans+=query(L,R,mid+1,r,rs);
    return ans;
}
int main()
{
    read(n),build(1,n,root);
    for(int i=1;i<=n;++i) read(a[i]);
    read(q);
    for(int i=1;i<=q;++i)
    {
        int l,r;
        read(l),read(r);
        ve[r].push_back((Query){l,i});
    }
    for(int i=1;i<=n;++i)
    {
        while(t1&&a[s1[t1]]<=a[i])
        {
            modify(s1[t1-1]+1,s1[t1],1,n,a[i]-a[s1[t1]],root);
            t1--;
        }
        while(t2&&a[s2[t2]]>=a[i])
        {
            modify(s2[t2-1]+1,s2[t2],1,n,a[s2[t2]]-a[i],root);
            t2--;
        }
        s1[++t1]=s2[++t2]=i,modify(1,n,1,n,-1,root),pushtag(root,1);
        int size=ve[i].size();
        for(int j=0;j<size;++j)
            ans[ve[i][j].id]=query(ve[i][j].l,i,1,n,root);
    }
    for(int i=1;i<=q;++i) printf("%lld\n",ans[i]);
    return 0;
}

Supongo que te gusta

Origin www.cnblogs.com/lhm-/p/12670727.html
Recomendado
Clasificación