只过了前两个点,蒟蒻求助QAQ
查看原帖
只过了前两个点,蒟蒻求助QAQ
455558
Imiya楼主2022/1/2 21:35
#include<iostream>
#include<cmath>
#include<algorithm>
#include<vector>
#include<cstring>
#define int long long
using namespace std;
inline int read(){
    int res=0,in=getchar(),sign=1;
    while(in<'0'||in>'9'){if(in=='-')sign=-1;in=getchar();}
    while(in>='0'&&in<='9')res=(res<<1)+(res<<3)+(in^48),in=getchar();
    return res*sign;
}
void print(int num){
    if(num>9)print(num/10);
    putchar((signed)(num%10)+'0');
}
const int N=1000100,M=250100;
struct bta{
    int t[M];
    void init(){memset(t,0,sizeof(t));}
    void add(int id,int k){while(id<M)t[id]+=k,id+=(id&-id);}
    int get_(int id){int res=0;while(id)res+=t[id],id-=(id&-id);return res;}
};
struct blk{
    int bel[M],laz[M],a[M],siz;
    void init(){siz=711;for(int i=1;i<M;i++)bel[i]=(i-1)/siz+1,laz[i]=a[i]=0; }
    void add(int l,int r,int k){
        for(int i=l,end=min(bel[l]*siz,r);i<=end;i++)a[i]+=k;
        if(bel[l]!=bel[r])for(int i=bel[r]*siz-siz+1;i<=r;i++)a[i]+=k;
        for(int i=bel[l]+1;i<bel[r];i++)laz[i]+=k;
    }
    int get_(int id){return a[id]+laz[bel[id]];}
};
int n,m,lp=1,rp,fl[N],fg[N],bel[N],a[N],res[N];
struct offline{
    int l,r,id,ans;
    bool operator<(const offline&b)const&{
        if(bel[l]==bel[b.l])
            if(bel[l]&1)return r>b.r;
            else return r<b.r;
        else return bel[l]<bel[b.l];
    }
}ask[N];
struct of2{
    int l,r,sign,id,is_r;
};
vector<of2>t[N];
void init(){
    n=read();m=read();
    int siz=(int)sqrt(n);
    bta b1;
    bta b2;
    b1.init();
    b2.init();
    for(int i=1;i<=n;i++){
        a[i]=read();
        bel[i]=(i-1)/siz;
        fl[i]=b1.get_(a[i]-1);
        fg[i]=b2.get_(M-1)-b2.get_(a[i]);
        b1.add(a[i],1);
        b2.add(a[i],a[i]);
    }
    for(int i=1;i<=m;i++)ask[i]={read(),read(),i,0};
    sort(ask+1,ask+m+1);
}
signed main(){
    init();
    for(int i=1;i<=m;i++){
        int L=ask[i].l,R=ask[i].r;
        if(rp<R)t[lp-1].emplace_back((of2){rp+1,R,-1,i,1});
        if(rp>R)t[lp-1].emplace_back((of2){R+1,rp,1,i,1});
        while(rp<R)rp++,ask[i].ans+=(fl[rp]+1)*a[rp]+fg[rp];
        while(rp>R)ask[i].ans-=(fl[rp]+1)*a[rp]+fg[rp],rp--;
        if(lp>L)t[rp].emplace_back((of2){L,lp-1,1,i,0});
        if(lp<L)t[rp].emplace_back((of2){lp,L-1,-1,i,0});
        while(lp>L)lp--,ask[i].ans-=fl[lp]*a[lp]+fg[lp];
        while(lp<L)ask[i].ans+=fl[lp]*a[lp]+fg[lp],lp++;
    }
    blk b1;blk b2;
    b1.init();b2.init();
    for(int i=1;i<=n;i++){
        b1.add(a[i]+1,M-1,1);
        b2.add(1,a[i]-1,a[i]);
        for(int j=0;j<t[i].size();j++)
            for(int k=t[i][j].l;k<=t[i][j].r;k++)
                if(t[i][j].is_r)ask[t[i][j].id].ans+=t[i][j].sign*(b1.get_(a[k])*a[k]+b2.get_(a[k]));
                else ask[t[i][j].id].ans+=t[i][j].sign*((b1.get_(a[k])+1)*a[k]+b2.get_(a[k]));
    }
    for(int i=1;i<=m;i++)ask[i].ans+=ask[i-1].ans,res[ask[i].id]=ask[i].ans;
    for(int i=1;i<=m;i++)print(res[i]),putchar('\n');
    return 0;
}

断断续续调了一周QAQ

2022/1/2 21:35
加载中...