Description

给定:
两个长度为n的数列A 、B
一个有m个元素的集合K
询问Q次
每次询问[l,r],输出区间内满足|Bi-Bj|∈K 的最大Ai+Aj

数据约定:
n,Q<=100000
m <= 10
0<=A[i]<=1000000000
1<=B[i]<=n
1<=K[i]<=n
保证B[i]互不相等

Solution

这道题很难啊,一下子居然想不出来。虽然想到是线段树,但还是很迷。
我们想将询问按左端点从大到小排序。那么对于一个点x,我们只要看一下在x之前和当前的询问的左端点之间是否存在|Bi-Bj|∈K即可。
我们逐个按询问来做,做个扫描线。对当前加入的点x,枚举A,我们看x之后是否有|By-Bx|∈K,假设存在,我们就在y的位置插入一个Ax+Ay的值。每次询问只要查询一下[l,r]之间的最大值即可。因为一个点x的假设存在值,那么和它匹配的数y一定在[l,x]的范围内。而x∈[l,r],所以y∈[l,r]。

Code

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=1e5+5;
struct code{int a,b,c;
}l[maxn];
int f[maxn],a[maxn],b[maxn],c[maxn],d[maxn],ans[maxn];
int n,i,t,j,k,x,y,q,m,z;
bool cmp(code x,code y){return x.a>y.a;
}
int lowbit(int x){return x&(-x);
}
void insert(int x){if (x>n) return;f[x]=max(f[x],z);insert(x+lowbit(x));
}
void make(int j,int x){if (x<0 || !d[x] || x>n) return;z=a[j]+a[d[x]];insert(d[x]);
}
int find(int x){if (x<1) return 0;return max(f[x],find(x-lowbit(x)));
}
int main(){freopen("data.in","r",stdin);freopen("data.out","w",stdout);scanf("%d%d%d",&n,&q,&m);for (i=1;i<=n;i++)scanf("%d",&a[i]);for (i=1;i<=n;i++)scanf("%d",&b[i]);for (i=1;i<=m;i++)scanf("%d",&c[i]);for (i=1;i<=q;i++)scanf("%d%d",&l[i].a,&l[i].b),l[i].c=i;sort(l+1,l+q+1,cmp);l[0].a=n+1;for (i=1;i<=q;i++){for (j=l[i-1].a-1;j>=l[i].a;j--){for (k=1;k<=m;k++)make(j,b[j]+c[k]),make(j,b[j]-c[k]);d[b[j]]=j;}ans[l[i].c]=find(l[i].b);}for (i=1;i<=q;i++)printf("%d\n",ans[i]);
}

【51Nod 1463】 找朋友相关推荐

  1. [51nod 1463]找朋友

    题目大意 两个序列A和B. 每次询问区间[l,r],从该区间挑出两个下标i,j,满足|Bi-Bj|处于集合S中,并要求最大化Ai+Aj的值. S集合的大小<=10,B是n的一个排列. 扫描线 我 ...

  2. 51nod1463 找朋友

    1463 找朋友  基准时间限制:1.5 秒 空间限制:262144 KB 分值: 80  难度:5级算法题  收藏  关注 给定: 两个长度为n的数列A .B 一个有m个元素的集合K 询问Q次 每次 ...

  3. SDUTOJ2779_找朋友(BFS | | DFS双解法)

    找朋友 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description X,作为户外运动的忠实爱好者, ...

  4. 在vc++里面进行图像处理的时候应该把图形放哪_图形找朋友小班教案

    图形找朋友小班教案 作为一位优秀的人民教师,时常要开展教案准备工作,编写教案助于积累教学经验,不断提高教学质量.我们该怎么去写教案呢?下面是小编收集整理的图形找朋友小班教案,欢迎大家借鉴与参考,希望对 ...

  5. Java中找朋友的代码_找朋友游戏介绍

    分牌 找朋友游戏中每张5.10和K是分牌,5代表5分,10代表10分,K也代表10分,三副牌共300分.游戏中,每方都要尽量 抓获这些分牌.扣在底牌中的分牌,在计算时如果庄家被对方扣底则要加倍计算. ...

  6. 奉劝各位开发人员几句真话:在求职招聘软件上投简历就是浪费时间,找朋友内推靠谱多了!...

    最近有网友给各位开发人员奉劝了几句真话: 如果没有扎实巩固的基础知识.丰富的开发经验和985.211的学历,在求职招聘软件上找工作纯属浪费时间.建议多和自己朋友联系,他们内推远比求职招聘软件上承诺的内 ...

  7. 找呀找呀找朋友简谱用计算机弹,儿歌找朋友简谱_儿歌找朋友歌词歌谱

    <找朋友>是伴随很多人一起成长的经典儿歌,更是一首非常适合小朋友的启蒙歌曲.许多家长们也在找着找朋友的简谱,那就一起来看看小编整理的找朋友简谱吧! <找朋友>--儿歌在孩子成长 ...

  8. 并查集---找朋友圈个数问题,连通度问题,等的有效算法

    数据结构方面,你了解并查集么? 上交05年计算机复试 上机 畅通工程问题: 例题1 修路连通问题 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通 ...

  9. 淘宝可以找人找朋友代付款吗?

    淘宝可以找人或找朋友帮忙代付款,在淘宝购物提交订单时选择帮我付或者在购物车找到待付款的商品点击付款后,选择付款方式为找朋友帮忙付都可以实现淘宝代付款. 淘宝怎么发起找人找朋友代付款? 1.在淘宝APP ...

  10. 学习英文-学以致用【场景:找朋友】

    学习英文-学以致用. 场景说明 生活中,出门找朋友很常见,该如何表达呢? 场景对话 DaLiang: Hi, I come to meet with (meet up with) Zhou? Hi, ...

最新文章

  1. 【虚拟机】关于VMware 提示“无法获得VMCI驱动程序的版本:句柄无效”的解决方案...
  2. IOS 9人机界面指南(1):UI设计基础
  3. 小白入门机器学习必备:编程语言环境介绍及搭建
  4. python不同时间周期k线_请问期货不同时间级别的k线呈现相反形态怎么判断买卖点?...
  5. mac终端shell颜色
  6. latex 公式编号_放弃mathtype,word也可以轻松输入公式
  7. 快排、归并、堆排序运用场景
  8. 系统学习机器学习之半参数方法(一)--基于距离
  9. Microsoft Visual Studio 2010安装教程
  10. 关于Linux性能调优中系统CPU监测信息统计的一些笔记
  11. NPN型三极管基础知识解析
  12. iPad忘记密码时恢复出厂设置
  13. u盘启动盘制作工具多个linux,多系统U盘启动盘制作工具
  14. 电脑快捷键大全 Ctrl
  15. 程序设计思维与实践 Week14 限时大模拟A - 猫睡觉问题
  16. 关于两个鸡蛋判断楼层问题
  17. 系统架构设计基础(一)
  18. openwrt查看linux内核,OpenWrt教程-如何升级linux内核版本
  19. python 线程终止后再启动
  20. 我们正处在大数据时代,浅谈大数据

热门文章

  1. 直流电磁铁的设计计算
  2. 智能家居照明系统设计
  3. 终于有人说清楚了什么是DRAM、什么是NAND Flash
  4. 糖果儿,77,与网络暴民
  5. openssl make报错
  6. 星际战甲结合扫描目标位置
  7. 体检行业的未来--与大数据据结合
  8. 解决报错Uncaught ReferenceError: $ is not defined at index.html
  9. PTA 数据结构与算法 7-40 奥运排行榜
  10. Flutter——最详细(GridView)使用教程