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] [ai−k,ai+k] 的个数。
注意维护 B I T BIT BIT和更新答案的先后顺序,因为答案不能计算本身。
时间复杂度: O ( n n log n ) O(n\\sqrt n\\log n) O(nnlogn)
#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 && 分块)