*! Magia de las sombras AHOI / HNOI2017


\ (N, m2e5 \)

SOL:

\ (L [i], R [i] \) represento \ (I \) a la izquierda y derecha de la primera posición de su

  1. \ ((L [i], R [i]) \) producto \ (\ P1) contribución, la \ (R [i] \) para la temporización \ (L [i] \) Actualización
  2. \ ((L [i] 1 \ a i-1, R [i]) \) producto \ (P2 \) contribución, la \ (R [i] \) tiempo para \ (L [i] 1 \ a i-1 \) actualización
  3. \ ((L [i], i + 1 \ a R [i] -1) \) producto \ (P1 \) contribución, la \ (L [i] \) tiempo para \ (i + 1 \ a R [ i] -1 \) actualización

\ (L-1 \) consulta \ (l, r \) respuesta \ (ans1 \)

\ (R \) consulta \ (l, r \) respuesta \ (ANS2 \)

\ (ANS = ANS1-ANS2 \) (pensar en ello)

¿Por qué no contar el peso?

Cada tiempo para encontrar un valor máximo, correspondiente a la secuencia en un medio, no se afectan entre sí

Complejidad de tiempo \ (O (nlog_n) \)

#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){
    int x=0,f=1;char c=getchar();
    while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
    while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
    return f==1?x:-x;
}
const int N=2e5+4;
struct ques{
    int t,l,r,x,fl;
}q[N*5];
inline bool comp(const ques &a,const ques &b){
    return a.t==b.t?(!a.fl):a.t<b.t;
}
int n,m,p1,p2,tot,a[N],L[N],R[N],t1[N],t2[N],st[N],ans[N];
inline void add(int x,int v){
    for(int i=x;i<=n;i+=i&-i){
        t1[i]+=v;t2[i]+=x*v;
    }
}
inline int ask(int x){
    int ret=0;
    for(int i=x;i;i-=i&-i)
        ret+=(x+1)*t1[i]-t2[i];
    return ret;
}
signed main(){
    n=read();m=read();p1=read();p2=read();
    for(int i=1,top=0;i<=n;i++){
        a[i]=read();
        while(top&&a[i]>a[st[top]]){R[st[top]]=i;top--;}
        L[i]=st[top];
        st[++top]=i; 
    }
    for(int i=1;i<=n;i++){
        if(!R[i])R[i]=n+1;
        if(R[i]<=n&&L[i])q[++tot]=(ques){R[i],L[i],L[i],p1,0};
        if(R[i]<=n&&L[i]+1<=i-1)q[++tot]=(ques){R[i],L[i]+1,i-1,p2,0};
        if(L[i]&&i+1<=R[i]-1)q[++tot]=(ques){L[i],i+1,R[i]-1,p2,0};
    }
    for(int i=1,l,r;i<=m;i++){
        l=read();r=read();
        ans[i]+=(r-l)*p1;
        q[++tot]=(ques){l-1,l,r,i,-1};
        q[++tot]=(ques){r,l,r,i,1};
    }
    sort(q+1,q+tot+1,comp);
    for(int i=1;i<=tot;i++){
        if(!q[i].fl){
            add(q[i].l,q[i].x);
            add(q[i].r+1,-q[i].x);
        }
        else{
            ans[q[i].x]+=q[i].fl*(ask(q[i].r)-ask(q[i].l-1));
        }
    }
    for(int i=1;i<=m;i++)cout<<ans[i]<<"\n";
    return (0-0);
}

Supongo que te gusta

Origin www.cnblogs.com/aurora2004/p/12520176.html
Recomendado
Clasificación