慢在哪了
查看原帖
慢在哪了
800499
suzhikz楼主2024/12/27 15:30
#include<bits/stdc++.h>
#define ll long long
#define reg register
#define db double
#define il inline
//#define int long long
using namespace std;
void read(int &x){x=0;int f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}x*=f;}
void read(ll &x){x=0;int f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}x*=f;}
const int N=5e5+10;int blo=803;
int n,m,a[N];
struct node{
	int l,r,w;
}z[N];int len,inv[N];
struct abc{
	int pos,w,l,r;
}q[N];
int rubid[N],rubw[N],tot;bool lorr[N];
int id[N],R[N];
ll tmp,ans[N];
bool cmp1(node a,node b){if((a.l-1)/blo==(b.l-1)/blo)return a.r>b.r;return a.l<b.l;}
bool cmp2(abc a,abc b){return a.w<b.w;}
il int del(int pos,bool flag){
	pos=inv[pos];
	if(flag==0){
		if(q[pos].l&&q[pos].r)tmp+=abs(q[q[pos].l].pos-q[q[pos].r].pos);
		if(q[pos].l)tmp-=abs(q[q[pos].l].pos-q[pos].pos),q[q[pos].l].r=q[pos].r;
		if(q[pos].r)tmp-=abs(q[q[pos].r].pos-q[pos].pos),q[q[pos].r].l=q[pos].l;
		return 0;
	}else{
		int re=0;
		if(q[pos].l&&q[pos].r)re-=abs(q[q[pos].l].pos-q[q[pos].r].pos);
		if(q[pos].l)re+=abs(q[q[pos].l].pos-q[pos].pos);
		if(q[pos].r)re+=abs(q[q[pos].r].pos-q[pos].pos);
		rubid[++tot]=q[pos].l;lorr[tot]=1;rubw[tot]=q[q[pos].l].r;
		rubid[++tot]=q[pos].r;lorr[tot]=0;rubw[tot]=q[q[pos].r].l;
		q[q[pos].l].r=q[pos].r;q[q[pos].r].l=q[pos].l;return re;
	}
}
il void rebuild(int x){
	while(tot>x){
		if(lorr[tot]){
			q[rubid[tot]].r=rubw[tot];
		}else{
			q[rubid[tot]].l=rubw[tot];
		}
		tot--;
	}
}
ll ans2[N];
signed main(){
//	freopen("my.in","r",stdin);
	read(n);read(m);
	for(int i=1;i<=n;i++)read(a[i]);
	for(int i=1;i<=m;i++){
		read(z[i].l);read(z[i].r);z[i].w=i;
	}
	sort(z+1,z+1+m,cmp1);
	int L=1;
	for(int i=1;i<=n;i++){
		id[i]=(i-1)/blo+1;R[id[i]]=i;
	}
	
	for(int j=1;j<=n;j++){
		q[++len].pos=j;q[len].w=a[j];
	}
	sort(q+1,q+1+len,cmp2);
	for(int i=1;i<=len;i++){
		inv[q[i].pos]=i;q[i].l=i-1;q[i].r=(i==len?0:i+1);
		if(i!=1)tmp+=abs(q[i].pos-q[i-1].pos);
	}
	for(int i=1;i<=n/blo+1;i++){
		int r=n;
		if(i!=1)
		for(int j=R[i-2]+1;j<=R[i-1];j++){
			del(j,0);
		}
		int fl=L;
		while(L<=m&&id[z[L].l]==i){
			while(r>z[L].r){
				ans[z[L].w]-=del(r,1);r--;
			}
//			ans[z[L].w]+=tmp;
			int book=tot;
			for(int j=R[i-1]+1;j<z[L].l;j++){
				ans2[z[L].w]-=del(j,1);
			}
			rebuild(book);
			L++;
		}
		for(int i=fl+1;i<L;i++)ans[z[i].w]+=ans[z[i-1].w];for(int i=fl;i<L;i++)ans[z[i].w]+=tmp+ans2[z[i].w];
		rebuild(0);
	}
	for(int i=1;i<=m;i++)printf("%lld\n",ans[i]);
	return 0;
}

2024/12/27 15:30
加载中...