线段树60分,求助
查看原帖
线段树60分,求助
648660
Name1楼主2022/5/28 15:23
#include<algorithm>
#include<iostream>
#include<cstdio>
#define pair pairty
#define ls x<<1,l,mid
#define rs x<<1|1,mid+1,r
using namespace std;
const int N=3e5+10;
int n,m,cnt;
long long ans;
struct tree{int lc,rc;}g[N<<2];
struct node
{
	int val,num;
	bool operator <(const node a)const{return a.val<val;}
}a[N<<2];
struct good
{
	int l,r;
	bool operator <(const good a)const{return r<a.r;}
}pairty[N<<2];
struct asks
{
	int l,r,i;
	bool operator <(const asks a)const{return r<a.r;}
}ask[N<<2];
inline int read()
{
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
	return x*f;
}
void merge(int l,int r)
{
	pair[++cnt].l=min(a[l].num,a[r].num);
	pair[cnt].r=max(a[l].num,a[r].num);
}
void update(int x,int l,int r,int p,int flag)
{
	if(l>p||r<p)return;
	if(l==p&&r==p)
	{
		if(flag==0)g[x].lc++;
		else g[x].rc++;
		return;
	}
	int mid=(l+r)>>1;
	update(ls,p,flag);
	update(rs,p,flag);
	g[x].lc=g[x<<1].lc+g[x<<1|1].lc;
	g[x].rc=g[x<<1].rc+g[x<<1|1].rc;
}
int query(int x,int l,int r,int ql,int qr,int flag)
{
	if(ql<=l&&r<=qr)
	{
		if(flag==0)return g[x].lc;
		else return g[x].rc;
	}
	if(ql>r||l>qr)return 0;
	int mid=(l+r)>>1;
	return query(ls,ql,qr,flag)+query(rs,ql,qr,flag);
}
int main()
{
	n=read(),m=read();
	for(int i=1;i<=n;i++)
	{
		a[i].num=i;
		a[i].val=read();
	}
	sort(a+1,a+1+n);
	merge(1,2);merge(n,n-1);
	for(int i=2;i<n;i++)
	{
		int absl=abs(a[i].val-a[i-1].val),absr=abs(a[i].val-a[i+1].val);
		if(absl==absr)merge(i,i-1),merge(i,i+1);
		else if(absl<absr)         merge(i,i-1);
		else                       merge(i,i+1);
	}
	sort(pair+1,pair+1+cnt);
	for(int i=1;i<=m;i++)
		ask[i].l=read(),ask[i].r=read(),ask[i].i=i;
	sort(ask+1,ask+1+m);
	int cntt=1;
	for(int i=1;i<=m;i++)
	{
		while(ask[i].r>=pair[cntt].r&&cntt<=cnt)
		{
			update(1,1,n,pair[cntt].l,0);
			update(1,1,n,pair[cntt].r,1);
			cntt++;
		}
		ans+=(query(1,1,n,1,ask[i].r,1)-query(1,1,n,1,ask[i].l-1,0))*ask[i].i;
	}
	printf("%lld",ans);
	return 0;
}
2022/5/28 15:23
加载中...