正题

题目链接:https://jzoj.net/senior/#contest/show/2990/2


题目大意

一个小队满足要求

  1. 队长的地位最高
  2. 所有队员和队长的年龄差不超过kkk

给出nnn个人的地位和年龄,qqq个询问

每次询问一组(x,y)(x,y)(x,y)求若(x,y)(x,y)(x,y)在同一个队里那这个队的最多人数。


解题思路

我们将年龄离散化然后按照地位从大到小排序。

然后我们用树状数组维护出每个人作为队长时小队的最多人数。

之后我们对于每个询问(x,y)(x,y)(x,y),默认yyy的地位大于xxx。

我们按照地位从大到小枚举,对于每个(x,y)(x,y)(x,y),我们搞定满足条件的年龄范围(l,r)(l,r)(l,r),然后将地位比yyy大的最多人数都丢进线段树里,然后查询区间(l,r)(l,r)(l,r)即可。


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N=1e5+10;
struct node{int r,w,num;
}a[N];
int n,k,Q,cnt,ans[N];
int b[N],num[N],l[N],r[N],v[N];
vector<int> q[N];
struct Tree_Array{#define lowbit(x) (x&-x)int t[N];void Change(int x,int z){while(x<=n){t[x]+=z;x+=lowbit(x);}return;}int Ask(int x){int ans=0;while(x){ans+=t[x];x-=lowbit(x);}return ans;}#undef lowbit(x)
}TA;
struct Seq_Tree{struct Tree_node{int l,r,w;}t[N*4];void Build(int x,int l,int r){t[x].l=l;t[x].r=r;t[x].w=-1;if(l==r)return;int mid=(l+r)/2;Build(x*2,l,mid);Build(x*2+1,mid+1,r);}void Change(int x,int pos,int z){if(t[x].l==t[x].r){t[x].w=max(t[x].w,z);return;}int mid=(t[x].l+t[x].r)>>1;if(pos<=mid) Change(x*2,pos,z);else Change(x*2+1,pos,z);t[x].w=max(t[x*2].w,t[x*2+1].w);}int Ask(int x,int l,int r){if(t[x].l==l&&t[x].r==r)return t[x].w;int mid=(t[x].l+t[x].r)>>1;if(r<=mid) return Ask(x*2,l,r);if(l>mid) return Ask(x*2+1,l,r);return max(Ask(x*2,l,mid),Ask(x*2+1,mid+1,r));}
}T;
bool cmp(node x,node y)
{return x.r>y.r;}
int main()
{scanf("%d%d",&n,&k);for(int i=1;i<=n;i++)scanf("%d",&a[i].r),a[i].num=i;for(int i=1;i<=n;i++)scanf("%d",&a[i].w),b[++cnt]=a[i].w;sort(b+1,b+1+cnt);cnt=unique(b+1,b+1+cnt)-b-1;sort(a+1,a+1+n,cmp);for(int i=1;i<=n;i++){num[a[i].num]=i;l[i]=lower_bound(b+1,b+1+cnt,a[i].w-k)-b;r[i]=upper_bound(b+1,b+1+cnt,a[i].w+k)-b-1;a[i].w=lower_bound(b+1,b+1+cnt,a[i].w)-b;TA.Change(a[i].w,1);}scanf("%d",&Q);for(int i=1;i<=Q;i++){int x,y;scanf("%d%d",&x,&y);x=num[x];y=num[y];if(x<y)swap(x,y);q[y].push_back(i);v[i]=x;}int w=1;T.Build(1,1,cnt);for(int i=1;i<=n;i++){while(w<=n&&a[w].r>=a[i].r){int val=TA.Ask(r[w])-TA.Ask(l[w]-1);T.Change(1,a[w].w,val);w++;}for(int j=0;j<q[i].size();j++){int x=v[q[i][j]],y=i;int L=max(l[x],l[y]),R=min(r[x],r[y]);if(L>R)  ans[q[i][j]]=-1;else ans[q[i][j]]=T.Ask(1,L,R);}TA.Change(a[i].w,-1);}for(int i=1;i<=Q;i++)printf("%d\n",ans[i]);
}

jzoj3854-分组【树状数组,线段树】相关推荐

  1. D-query SPOJ - DQUERY(求区间不同数的个数)(树状数组||线段树+离散)(主席树+在线)

    English Vietnamese Given a sequence of n numbers a1, a2, -, an and a number of d-queries. A d-query ...

  2. HDU 1556 前缀和 树状数组 线段树

    解法一: a[i]表示以 i作为起点,对 i-n的气球全部上色的次数  对(start,end)区间上色 ++a[start] --a[end+1]抵消掉 end+1-n的部分 问题转换为求 a的前缀 ...

  3. 模板三连击:树状数组+线段树+主席树

    没事儿干,复习模板...... 1.树状数组 本来不想写这个的,但是反正就几分钟就打完了,所以就写了,水AC数. 洛谷 P3374 [模板]树状数组 1 1 #include<cstdio> ...

  4. 51nod 1680区间求和 (dp+树状数组/线段树)

    不妨考虑已知一个区间[l,r]的k=1.k=2....k=r-l+1这些数的答案ans(只是这一个区间,不包含子区间) 那么如果加入一个新的数字a[i](i = r+1) 则新区间[l, i]的答案为 ...

  5. CCF201709-5 除法(100分)【树状数组+线段树】

    试题编号: 201709-5 试题名称: 除法 时间限制: 10.0s 内存限制: 256.0MB 问题描述: 问题描述 小葱喜欢除法,所以他给了你N个数a1, a2, ⋯, aN,并且希望你执行M次 ...

  6. POJ2182 HDU2711 Lost Cows【树状数组+线段树】

    Lost Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 17113 Accepted: 10664 Descripti ...

  7. P2357 守墓人(树状数组/线段树)

    题目描述 在一个荒凉的墓地上 有一个令人尊敬的守墓人, 他看守的墓地从来 没有被盗过, 所以人们很放心的把自己的先人的墓 安顿在他那 守墓人能看好这片墓地是必然而不是偶然..... 因为....守墓人 ...

  8. 差分+树状数组 线段树【P2357】 守墓人

    题目描述-->p2357 守墓人 敲了一遍线段树,水过. 树状数组分析 主要思路: 差分 简单介绍一下差分(详细概念太麻烦,看下面. 给定一个数组 7 8 6 5 1 8 18 20 35 // ...

  9. [CSP-S模拟测试]:影魔(树状数组+线段树合并)

    题目背景 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万. 千百年来,他收集了各式各样的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄. 每一个灵魂,都有着 ...

最新文章

  1. 1. vi 与 vim 有什么区别呢,它们之间有什么关系?
  2. IDEA(IntelliJ IDEA)+常用快捷键(short cuts)
  3. 国外计算机音乐专业,音乐留学干货 | 国外电子音乐专业留学如何?
  4. A definition for the symbol 'symbolName' could not be located
  5. Leetcode 125. 验证回文串 解题思路及C++实现
  6. 分享 | 光纤光缆布线基础知识及系统设计
  7. 两个用于Eclipse的TCK –开源到底有什么?
  8. 常用牛人主页链接(计算机视觉、模式识别、机器学习相关方向,陆续更新。。。。)【转】...
  9. r 语言ylim = c(0 1),今日R--条形图(barplot)
  10. 8086cpu学习笔记(3):寻址方式
  11. struts2文件下载及文件名中文问题
  12. 频率超出范围黑屏Linux,显示器超出频率限制黑屏怎么解决?显示器超出频率限制黑屏解决方法...
  13. 强力推荐!五款能让你成为Excel“高手”的Excel插件
  14. 换页符'\f'的问题
  15. 轻松恢复U盘隐藏文件
  16. 融云发布公告:五大高级功能将全面开放
  17. 【Day2.2】茶卡盐湖
  18. Java遍历jar包所有类-后续
  19. 西安“大唐不夜城·现代唐人街”开街 传统与现代混搭并存
  20. OpenCV python(二)图像预处理:改变图像大小 提取感兴趣区域

热门文章

  1. python中random什么意思_python中的random
  2. Mysql存储过程名规则_sql 存储过程命名规范
  3. mysql怎么访问用户B_MySQL访问控制和用户管理
  4. 在oracle中游标的操作,Oracle中的游标和函数详解
  5. mysql os.pid_MySQL在OS El Capitan的配置[PID file error]
  6. 算法设计与分析——回溯法——旅行售货员问题
  7. 7-1 装载问题 (10 分)(思路+详解)
  8. java堆和栈 常量池_GitHub - han-guang-xue/difference-of-stack-heap-pool: Java中堆、栈和常量池的区别...
  9. 八数码问题I-bfs和map标记
  10. The Last Non-zero Digit POJ - 1150(n!mod p)