3854. 【NOIP2014八校联考第2场第2试9.28】分组

Description

Bsny所在的精灵社区有n个居民,每个居民有一定的地位和年龄,ri表示第i个人的地位,ai表示第i个人的年龄。
最近社区里要举行活动,要求几个人分成一个小组,小组中必须要有一个队长,要成为队长有这样的条件:
1、队长在小组中的地位应该是最高的(可以并列第一);
2、小组中其他成员的年龄和队长的年龄差距不能超过K。
有些人想和自己亲密的人组在同一个小组,同时希望所在的小组人越多越好。比如x和y想在同一个小组,同时希望它们所在的小组人越多越好,当然,它们也必须选一个符合上述要求的队长,那么问你,要同时包含x和y的小组,最多可以组多少人?

Input

第一行两个整数n和K;
接下来一行输入n个整数:r1, r2, …, rn
接下来一行输入n个整数:a1, a2, …, an
接下来输入Q表示有Q个询问;
接下来Q行每行输入x, y,表示询问:当x和y组在同一个小组,它们小组最多可以有多少人(x和y也有可能被选为队长,只要它们符合条件)。

Output

对于每个询问,输出相应的答案,每个答案占一行。
当x和y无法在同一组时,输出-1(比如x的年龄是1, y的年龄是100,K=1,无论谁当队长,x和y两者中,总会有人跟队长的年龄差距超过K,那么输出-1)。

Sample Input

5 1
1 5 4 1 2
4 4 3 2 2
4
5 3
2 3
2 5
4 1

Sample Output

4
3
-1
4
【样例解释】
询问1:当第5个人和第3个人想在一组时,小组成员可以有{1, 3, 4, 5},选择3当队长,而2不可以加入,因为2加入的话,5和2的年龄差距为2,超过K=1了;
询问2:当第2个人和第3个人想在一组时,可以选择{1, 2, 3};
询问3:当2和5想在一起时,无法满足要求;
询问4:当4和1想在一起时,可以选择{1, 3, 4, 5};

Data Constraint

20%的数据:2≤n≤100,0≤ k≤100,1≤ ri, ai ≤100,1≤ q≤ 100;
40%的数据:2≤ n≤1000,0≤ k≤ 1000,1≤ ri, ai ≤ 1000,1≤ q≤ 1000;
60%的数据:2≤ n≤ 10^4,0≤ k≤ 10^9,1≤ ri, ai ≤ 10^9,  1≤ q≤ 10^4;
100%的数据:2≤ n≤ 10^5,0≤ k≤ 10^9,1≤ ri, ai ≤ 10^9,1≤ q≤ 10^5,1≤ x, y≤ n, x≠y。

Solution

100 分做法:离散化+树状数组+离线处理+线段树 首先对于每个人,我们可以预处理如果他是队长的话,最多可以有少人组队: 这里需要对 r 进行从小到大排序,排序完后,我们可以从小到大遍历每个人, 利用树状数组统计[ai-k, ai+k]的人数,即为第 i 个人作为队长最大组队人数 这里要对相同 r 的时候特殊处理一下 然后,对于一组询问 x,y, 我们可以计算出能包含 x,y 的组,队长的 a 和 r 的 限制条件,即 a 的范围为[max(x.a-k, y.a+k), min(x.a+k, y.a+k)], r 的范围为 r>=max(x.r, y.r) 我们可以在符合 a,r 范围的所有人中寻找最大值 但考虑到询问比较大,我们可以采取离线的方式处理询问: 用 rmin 表示满足询问 r 的最小值,即 max(x.r, y.r),对询问根据 rmin 从大到 小排序,接下来的处理就是求[max(x.a-k, y.a+k), min(x.a+k, y.a+k)]范围中最大值 是多少,这个可以用线段树来维护和求解 如果 max(x.a-k, y.a+k)> min(x.a+k, y.a+k)或者找不到符合 r 的人,那么答案为 -1 因此,总的复杂度为 O(nlogn)

Code

#include<cstdio>
#include<algorithm>
#include<cstring>
#define I int
#define ll long long
#define F(i,a,b) for(I i=a;i<=b;i++)
#define Fd(i,a,b) for(I i=a;i>=b;i--)
#define mem(a,b) memset(a,b,sizeof a)
#define N 100010
using namespace std;
void rd(I &x){
	x=0;I w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	x*=w;
}
I n,k,mi,ma,q,d[N],f[N],tr[N*16],ls[N*16],rs[N*16];
I t[N],nx[N],l[N],b[N],tot,ans[N],cnt;
struct node{I r,x,id;}a[N];
I cmp(node x,node y){return x.r<y.r;}
void add2(I x,I y,I z){t[++tot]=y,nx[tot]=l[x],l[x]=tot,b[tot]=z;}
void up1(I x){tr[x]=tr[ls[x]]+tr[rs[x]];}
void up2(I x){tr[x]=max(tr[ls[x]],tr[rs[x]]);}
void ins(I x,I l,I r,I k,I p,I type){
	if(l==r){if(type==1) tr[x]+=p;else tr[x]=max(tr[x],p);return;}
	I M=l+r>>1;
	if(k<=M){
		if(!ls[x]) ls[x]=++cnt;
		ins(ls[x],l,M,k,p,type);
	}
	else{
		if(!rs[x]) rs[x]=++cnt;
		ins(rs[x],M+1,r,k,p,type);
	}
	if(type==1) up1(x);else up2(x);
}
I qry(I x,I l,I r,I l2,I r2,I type){
	if(!x) return 0;
	if(l==l2&&r==r2) return tr[x];
	I M=l+r>>1,ST=0;
	if(r2<=M){
		I now=qry(ls[x],l,M,l2,r2,type);
		if(type==1) ST+=now;else ST=max(ST,now);
	}
	else if(l2>M){
		I now=qry(rs[x],M+1,r,l2,r2,type);
		if(type==1) ST+=now;else ST=max(ST,now);
	}
	else{
		if(type==1) ST=qry(ls[x],l,M,l2,M,type)+qry(rs[x],M+1,r,M+1,r2,type);
		else ST=max(qry(ls[x],l,M,l2,M,type),qry(rs[x],M+1,r,M+1,r2,type));
	}
	return ST;
}
I main(){
	rd(n),rd(k);
	F(i,1,n) rd(a[i].r),a[i].id=i;
	mi=1000000000;
	F(i,1,n){
		rd(a[i].x);
		mi=min(a[i].x,mi);ma=max(a[i].x,ma);
	}
	sort(a+1,a+1+n,cmp);
	cnt=1;
	I i=1;
	mem(tr,0),mem(ls,0),mem(rs,0);
	while(i<=n){
		I j=i;
		while(a[j].r==a[i].r) ins(1,mi,ma,a[j++].x,1,1);
		while(i<j){f[d[a[i].id]=i]=qry(1,mi,ma,max(mi,a[i].x-k),min(ma,a[i].x+k),1);i++;}
	}
	rd(q);
	F(i,1,q){
		I x,y;
		rd(x),rd(y);if(d[x]<d[y]) swap(x,y);add2(d[x],d[y],i);
	} 
	cnt=1;
	mem(tr,0),mem(ls,0),mem(rs,0);
	i=n;
	while(i){
		I j=i;
		while(a[j].x==a[i].x) ins(1,mi,ma,a[i].x,f[j--],2);
		while(i>j){
			for(I j=l[i];j;j=nx[j]){
				I l2=max(mi,max(a[i].x,a[t[j]].x)-k),r2=min(ma,min(a[t[j]].x,a[i].x)+k);
				if(l2<=r2) ans[b[j]]=qry(1,mi,ma,l2,r2,2);
			}
			i--;
		}
	}//×î´óÖµ
	F(i,1,q) if(!ans[i]) printf("-1\n");else printf("%d\n",ans[i]);
	return 0;
}
//ÎÊÌ⣺
//1.µØλÏàͬµÄҪͬʱ¼ÓÈëÏ߶ÎÊ÷
//2.¶ÔÓÚµØλ´Ó´óµ½Ð¡ÅÅÐòºó£¬Ñ¯ÎʵÄx£¬yµãµÄÄêÁä´óС²»Ò»¶¨£¬Òò´ËÒª±È½ÏÄêÁä´óС 
发布了199 篇原创文章 · 获赞 201 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/zsjzliziyang/article/details/104012108
今日推荐