HDU 6534(莫队&BIT)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 6534(莫队&BIT)相关的知识,希望对你有一定的参考价值。

HDU 6534(莫队&BIT)

没有修改的查询区间绝对值之差小于等于 k k k的对数,显然可以离线。先离散化一下值域。

考虑莫队,然后用 B I T BIT BIT维护对于值域范围为 [ a i − k , a i + k ] [a_i-k,a_i+k] [aik,ai+k] 的个数。

注意维护 B I T BIT BIT和更新答案的先后顺序,因为答案不能计算本身。

时间复杂度: O ( n n log ⁡ n ) O(n\\sqrt n\\log n) O(nn logn)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a) memset(a,0,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair<int,int>
#define fi first
#define se second
#define pb push_back
#define il inline
template<class T>
inline void read(T &x){ 
	x=0;int w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
	for(;ch>='0'&&ch<='9';ch=getchar())
		x=(x<<3)+(x<<1)+(ch&15);
	x*=w; 
}
int n,Q,a[N],block,tot;	
ll k;
ll ans[N];
struct query{
	int l,r,id,bk;
}q[N];
bool cmp(query a,query b){
	return a.bk!=b.bk?a.l<b.l:((a.bk&1)?a.r<b.r:a.r>b.r);
}
ll b[N],cnt,lt[N],rt[N];
struct BIT{
	#define lowbit(x) x&(-x)
	#define il inline
	ll s[N];
	int n;
	il void upd(int x,int v){
		while(x<=n){
			s[x]+=v;x+=lowbit(x);
		}return;
	}
	il ll que(ll x){
		ll ans=0;
		while(x){
			ans+=s[x];x-=lowbit(x);
		}return ans;
	}
}T;
int main(){
	read(n),read(Q),read(k);
	block=sqrt(n);//分块大小. 
	for(reg int i=1;i<=n;i++){
		read(a[i]);
		b[++cnt]=a[i],b[++cnt]=a[i]-k,b[++cnt]=a[i]+k;
	}
	T.n=3*n;
	sort(b+1,b+cnt+1);
	cnt=unique(b+1,b+cnt+1)-b-1;
	for(int i=1;i<=n;i++){
		lt[i]=lower_bound(b+1,b+cnt+1,a[i]-k)-b;
		rt[i]=lower_bound(b+1,b+cnt+1,a[i]+k)-b;
		a[i]=lower_bound(b+1,b+cnt+1,a[i])-b;
	}
	for(reg int i=1;i<=Q;i++){
		 int l,r;
		 read(l),read(r);
		q[i]={l,r,i,(l-1)/block+1};
	} 
	//Print(rt,n);
	sort(q+1,q+Q+1,cmp);
	int L=1,R=0;
	ll res=0;
	for(reg int i=1;i<=Q;i++){
		int l=q[i].l,r=q[i].r;
	//	printf("(%d,%d)\\n",l,r);
		while(L<l){
			T.upd(a[L],-1);
			res-=T.que(rt[L])-T.que(lt[L]-1);
			L++;
		}
		while(L>l){
			--L;
			res+=T.que(rt[L])-T.que(lt[L]-1);
			T.upd(a[L],1);
		}
		while(R<r){
			++R;
			res+=T.que(rt[R])-T.que(lt[R]-1);
			T.upd(a[R],1);
		}

		while(R>r){
			T.upd(a[R],-1);
			res-=T.que(rt[R])-T.que(lt[R]-1);
			R--;
		}
		ans[q[i].id]=res;
	}
	for(reg int i=1;i<=Q;i++)
		printf("%lld\\n",ans[i]);
}

以上是关于HDU 6534(莫队&BIT)的主要内容,如果未能解决你的问题,请参考以下文章

201⑨湘潭邀请赛 Chika and Friendly Pairs(HDU6534)

Chika and Friendly Pairs(莫队+树状数组+离散化+预处理上下界)

bzoj3744: Gty的妹子序列 (BIT && 分块)

HDU 6230 (Manacher&BIT)

hdu 4742 Pinball Game 3D(三维LIS&amp;cdq分治&amp;BIT维护最值)

hdu 5145 NPY and girls(分块+莫队+逆元)