树状数组写法只 AC Sub#1 求条
查看原帖
树状数组写法只 AC Sub#1 求条
785639
xuchuhan楼主2025/1/16 10:13

rt.

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e5+5;
int n,m,tot,ans,tree[N];
struct node{int w,id;}a[N];
struct pr{int l,r;}p[N<<1];
struct qs{int l,r,id;}q[N];
bool cmp1(node X,node Y){return X.w<Y.w;}
bool cmp2(pr X,pr Y){if(X.r!=Y.r)return X.r<Y.r;return X.l<Y.l;}
bool cmp3(qs X,qs Y){if(X.r!=Y.r)return X.r<Y.r;return X.l<Y.l;}
pr G(int x,int y){return{min(a[x].id,a[y].id),max(a[x].id,a[y].id)};}
int lb(int x){return x&(-x);}
void upd(int x,int val){while(x<=n)tree[x]=max(tree[x],val),x+=lb(x);return;}
int qy(int x){int res=0;while(x)res=max(res,tree[x]),x-=lb(x);return res;}
signed main(){
	cin>>n>>m;
	if(n==1){cout<<0;return 0;}
	for(int i=1;i<=n;i++){cin>>a[i].w;a[i].id=i;}
	sort(a+1,a+n+1,cmp1);
	p[++tot]=G(1,2),p[++tot]=G(n-1,n);
	for(int i=2;i<n;i++){
		if(a[i].w-a[i-1].w==a[i+1].w-a[i].w)p[++tot]=G(i-1,i),p[++tot]=G(i,i+1);
		else if(a[i].w-a[i-1].w>a[i+1].w-a[i].w)p[++tot]=G(i,i+1);
		else p[++tot]=G(i-1,i);
	}
	sort(p+1,p+tot+1,cmp2);
//	for(int i=1;i<=tot;i++)cout<<p[i].l<<" "<<p[i].r<<"\n";
	for(int i=1;i<=m;i++){cin>>q[i].l>>q[i].r;q[i].id=i;}
	sort(q+1,q+m+1,cmp3);
	for(int i=1,j=1;i<=m;i++){
		while(j<=tot&&p[j].r<=q[i].r)upd(p[j].l,1),j++;
		ans+=q[i].id*(j-1-qy(q[i].l-1));
//		cout<<(j-1-qy(q[i].l-1))<<" "<<q[i].id<<"\n";
	}
	cout<<ans;
	return 0;
}
2025/1/16 10:13
加载中...