其他分享
首页 > 其他分享> > Infinite Inversions 留个坑

Infinite Inversions 留个坑

作者:互联网

线段树板子先打上

#include<iostream>
#define ll long long
#define MAXN 100005
using namespace std;//区间最大值与最小值
ll A[MAXN],mx[MAXN<<2],lazy[MAXN<<2],mn[MAXN<<2],sum[MAXN<<2];
void PushUp(ll rt){
	mx[rt]=max(mx[rt<<1],mx[rt<<1|1]);
	mn[rt]=min(mn[rt<<1],mn[rt<<1|1]);
}
// void PushDown(ll rt, ll len){
	// if(lazy[rt]==0) return;
	// lazy[rt<<1]+=lazy[rt];
	// lazy[rt<<1|1]+=lazy[rt];
	// sum[rt<<1]+=lazy[rt]*(len-(len>>1));
	// sum[rt<<1|1]+=lazy[rt]*(len>>1);
	// lazy[rt]=0;
// }
void Build(ll l,ll r,ll rt){
	if(l==r){mx[rt]=A[l];mn[rt]=A[l];return;}
	ll m=(l+r)>>1;
	Build(l,m,rt<<1);
	Build(m+1,r,rt<<1|1);
	PushUp(rt);
}
// void Update(ll L,ll R,ll l,ll r,ll C,ll rt){
	// if(l>=L&&r<=R){sum[rt]+=C*(r-l+1);lazy[rt]+=C;return;}
	// PushDown(rt,r-l+1);
	// ll m=(l+r)>>1;
	// if(m>=L) Update(L,R,l,m,C,rt<<1);
	// if(m<R) Update(L,R,m+1,r,C,rt<<1|1);
	// PushUp(rt);
// }
ll QueryMx(ll L,ll R,ll l,ll r,ll rt){
	if(l>=L&&r<=R) return mx[rt];
	ll m=(l+r)>>1,ANS;
	if(m>=L) ANS=QueryMx(L,R,l,m,rt<<1);
	if(m<R) ANS=max(ANS,QueryMx(L,R,m+1,r,rt<<1|1));
	return ANS;
}
ll QueryMn(ll L,ll R,ll l,ll r,ll rt){
	if(l>=L&&r<=R) return mn[rt];
	ll m=(l+r)>>1,ANS;
	if(m>=L) ANS=QueryMn(L,R,l,m,rt<<1);
	if(m<R) ANS=min(ANS,QueryMn(L,R,m+1,r,rt<<1|1));
	return ANS;
}
ll Query(ll a,ll b,ll n){
	return QueryMx(a,b,1,n,1)-QueryMn(a,b,1,n,1);
}
int main(){
	ll n;
	cin>>n;
	for(int u=1;u<=n;u++) cin>>A[u];
	Build(1,n,1);
	while(true){
		ll a,b,c,d;
		cin>>b>>c;
		//cout<<Query(b,c,n)<<endl;
		cout<<QueryMx(b,c,1,n,1)<<endl;
		cout<<QueryMn(b,c,1,n,1)<<endl;
	}
	return 0;
}

标签:rt,留个,ll,Inversions,MAXN,Build,&&,ANS,Infinite
来源: https://www.cnblogs.com/cookiecheetah/p/15115352.html