【NOIP2014八校联考第2场第2试9.28】分组(group)
来源:互联网 发布:苹果mac怎么关闭程序 编辑:程序博客网 时间:2024/05/18 11:47
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
这题看你的写题能力,而且PASCAL的准备多打至少三个快拍……
首先,需要求出每个人作为队长,队伍里的人数
先把人按照地位排序,对于一个人,到他时,所有地位比他小的人的年龄都已经加入了权值线段树(权值代表年龄),他的答案就是他可取的年龄范围内的人数
单点修改+区间查询,是(权值)线段树的基本操作,但由于区间过大,需要动态开节点
时间复杂度
接着求答案,由于询问比较多,需要离线
发现,对于两个人,x和y,可以做他们的队长的人z必定满足以下条件
那么将每个询问按照
每次进行询问前,将所有地位
这也是(权值)线段树的基本操作,任然需要动态开节点
时间复杂度
Code
我认为我的程序算优美了,1800B,我看某些人3~5KB的人,同时偷笑
#include<cstdio>#include<algorithm>#include<cstring>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)#define N 101000using namespace std;int n,k,q,d[N],tot=1,ans[N],an;struct node{ int x,y,z,l;}a[N],b[N];struct nod1{ int l,r,d,z;}t[N*20];bool cnt(node x,node y){return x.x<y.x;}bool cmt(node x,node y){return x.z<y.z;}void insert(int v,int i,int j,int x,int y,int z){ if(z==0) t[v].d++; else t[v].d=max(t[v].d,y); if(i==j) return; int m=(i+j)/2; if(x<=m) if(!t[v].l) t[v].l=++tot; if(x>m) if(!t[v].r) t[v].r=++tot; if(x<=m) insert(t[v].l,i,m,x,y,z); else insert(t[v].r,m+1,j,x,y,z);}void get(int v,int i,int j,int x,int y,int z){ if(x>y) return; if(i==x&&j==y) { if(z==0) an+=t[v].d; else an=max(an,t[v].d); return; } int m=(i+j)/2; if(y<=m) get(t[v].l,i,m,x,y,z); else if(x>m) get(t[v].r,m+1,j,x,y,z); else get(t[v].l,i,m,x,m,z),get(t[v].r,m+1,j,m+1,y,z);}int main(){ freopen("group.in","r",stdin);freopen("group.out","w",stdout); scanf("%d%d",&n,&k); fo(i,1,n) scanf("%d",&a[i].x); fo(i,1,n) scanf("%d",&a[i].y),a[i].z=i; sort(a+1,a+n+1,cnt); int j=1; fo(i,1,n) { for(;a[j].x==a[i].x;j++) insert(1,1,1000000000,a[j].y,0,0); an=0;get(1,1,1000000000,max(a[i].y-k,1),min(a[i].y+k,1000000000),0); d[a[i].z]=an; } sort(a+1,a+n+1,cmt); scanf("%d",&q); fo(i,1,q) { scanf("%d%d",&b[i].x,&b[i].y); b[i].z=max(a[b[i].x].x,a[b[i].y].x); b[i].x=a[b[i].x].y; b[i].y=a[b[i].y].y; b[i].l=i; } sort(b+1,b+q+1,cmt); sort(a+1,a+n+1,cnt); memset(t,0,sizeof(t));tot=1; int l=q;j=n; fd(i,q,1) { for(;a[j].x>=b[i].z;j--) insert(1,1,1000000000,a[j].y,d[a[j].z],1); an=-1;get(1,1,1000000000,max(max(b[i].x-k,b[i].y-k),1),min(min(b[i].x+k,b[i].y+k),1000000000),1); ans[b[i].l]=an; } fo(i,1,q) if(ans[i]>0) printf("%d\n",ans[i]);else printf("-1\n");}
- 【NOIP2014八校联考第2场第2试9.28】分组(group)
- 【JZOJ3854】【NOIP2014八校联考第2场第2试9.28】分组(group)
- 【NOIP2014八校联考第2场第2试9.28】分组(group)
- 【NOIP2014八校联考第2场第2试9.28】单词接龙
- 【NOIP2014八校联考第2场第2试9.28】帮助Bsny(help)
- 【JZOJ3853】【NOIP2014八校联考第2场第2试9.28】帮助Bsny(help)
- 【JZOJ3853】【NOIP2014八校联考第2场第2试9.28】帮助Bsny(help)
- 【JZOJ3852】【NOIP2014八校联考第2场第2试9.28】单词接龙(words)
- JZOJ 3852. 【NOIP2014八校联考第2场第2试9.28】单词接龙(words)
- JZOJ 3853. 【NOIP2014八校联考第2场第2试9.28】帮助Bsny(help)
- {题解}[jzoj3853]【NOIP2014八校联考第2场第2试9.28】帮助Bsny(help)
- 【NOIP2014八校联考第2场第2试】单词接龙
- 【NOIP2014八校联考第2场第2试】帮助Bsny
- 【NOIP2014八校联考第2场第2试】帮助Bsny(help)
- [JZOJ]3858. 【NOIP2014八校联考第3场第2试10.5】挖掘机技术哪家强
- [JZOJ]3859. 【NOIP2014八校联考第3场第2试10.5】孤独一生
- 【NOIP2014八校联考第1场第2试】大水题(water)
- 【NOIP2014八校联考第1场第2试9.21】大水题(water)
- linux命令
- HDU4576 Robot 概率DP
- mysql学习历程
- Sort the Array (CF)
- SPOJ - Linearian Colony【分解为子问题】
- 【NOIP2014八校联考第2场第2试9.28】分组(group)
- UOJ 79 带花树入门
- 使用策略模式进行简单的form验证
- uoj 279: [UTR #2]题目交流通道 动态规划
- nginx过滤器模块
- LCD12864 为什么就是显示不了内容!
- 步步扎进Java-面向对象
- bzoj 2820: YY的GCD 莫比乌斯反演
- 图解Linux命令之--comm命令