51nod 1463 找朋友 (扫描线+线段树)
n Q m
A1 A2 ....An
B1 B2 ....Bn
K1 K2 ....Km
l1 r1
l2 r2
.
.
lQ rQ
Q行,每行一个整数表示相对应的答案。
如果找不到这样的两个数则输出0。
4 2 2
1 2 3 4
3 2 1 4
1 3
1 4
2 3
7
5 思路:
扫描线的思想,对每个询问右边界从小到大排序,因为边界时向右推的,
如果点b[j]+k或b[j]-k得到的数字在b数组中的位置在j的左边(pos为b[j]+k或b[j]-k在b数组中的位置),
题目要求最大的a[i]+a[j](pos就是倒着推出来的i),也就是a[pos]+a[j]最大,
我们可以将a[pos]+a[j]的值储存在下标为pos的地方,因为边界是向右走的,只有当pos在j的左边是才可以储存信息;
比如: 当前右边界:r = 5, j = 3,如果pos = 4,如果将值存在pos,当我们查询范围为4-5时,我们就会得到pos=4的值,但是这个是j=3,i=4的值,不能算进去。
如果pos = 2,小于j;我们能查询的区间是x-r(右边界为r),如果我们查询2 - 5,可以得到i=2,j=3的值,
因为对r排序,并且是从小到大走,所以当pos < j时,我们可以把值存在下标为pos的地方,用线段树或树状数组维护下区间的最大值就好了。 实现代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define mid int m = (l+r)>>1
const int M = 1e5+;
int sum[M<<],n,q,m;
int a[M],b[M],id[M],k[],cnt,maxx[M],ans[M];
struct node{
int l,r,id;
}e[M];
bool cmp(node x,node y){
if(x.r == y.r) return x.l < y.l;
else return x.r < y.r;
}
void pushup(int rt){
sum[rt] = max(sum[rt<<],sum[rt<<|]);
}
void update(int p,int c,int l,int r,int rt){
if(l == r){
sum[rt] = max(sum[rt],c);
return ;
}
mid;
if(p <= m) update(p,c,lson);
else update(p,c,rson);
pushup(rt);
} int query(int L,int R ,int l,int r,int rt){
if(L <= l&&R >= r){
return sum[rt];
}
mid;
int ret = ;
if(L <= m) ret = max(ret,query(L,R,lson));
if(R > m) ret = max(ret,query(L,R,rson));
return ret;
} int main()
{
ios::sync_with_stdio();
cin.tie(); cout.tie();
cin>>n>>q>>m;
for(int i = ;i <= n;i ++) cin>>a[i];
for(int i = ;i <= n;i ++) cin>>b[i],id[b[i]] = i;
for(int i = ;i <= m;i ++) cin>>k[i];
for(int i = ;i <= q;i ++){
cin>>e[i].l>>e[i].r;
e[i].id = i;
}
sort(e+,e++q,cmp);
int l = ;
for(int i = ;i <= q;i ++){
int r = e[i].r;
for(int j = l;j <= r;j ++){
for(int s = ;s <= m;s ++){
int num = b[j] + k[s];
int pos = id[num];
if(num <= n&&pos < j&&a[j] + a[pos] > maxx[pos]){
maxx[pos] = a[j] + a[pos];
update(pos,maxx[pos],,n,);
}
num = b[j] - k[s];
pos = id[num];
if(num >= &&pos < j&&a[j] + a[pos] > maxx[pos]){
maxx[pos] = a[j] + a[pos];
update(pos,maxx[pos],,n,);
}
}
}
ans[e[i].id] = query(e[i].l,e[i].r,,n,);
l = r;
}
for(int i = ;i <= q;i ++) cout<<ans[i]<<endl;
return ;
}
51nod 1463 找朋友 (扫描线+线段树)的更多相关文章
- 51nod 1463 找朋友(线段树+离线处理)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1463 题意: 思路: 好题! 先对所有查询进行离线处理,按照右区间排序, ...
- 51nod 1364 最大字典序排列(线段树)
1364 最大字典序排列基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 给出一个1至N的排列,允许你做不超过K次操作,每次操作可以将相邻的两个数交换,问能够得到的字 ...
- HDU 3642 - Get The Treasury - [加强版扫描线+线段树]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3642 Time Limit: 10000/5000 MS (Java/Others) Memory L ...
- 【BZOJ3958】[WF2011]Mummy Madness 二分+扫描线+线段树
[BZOJ3958][WF2011]Mummy Madness Description 在2011年ACM-ICPC World Finals上的一次游览中,你碰到了一个埃及古墓. 不幸的是,你打开了 ...
- HDU 3265/POJ 3832 Posters(扫描线+线段树)(2009 Asia Ningbo Regional)
Description Ted has a new house with a huge window. In this big summer, Ted decides to decorate the ...
- 【bzoj4491】我也不知道题目名字是什么 离线扫描线+线段树
题目描述 给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串 输入 第一行n,表示A数组有多少元素接下来一行为n个整数A[i]接下来一个整数Q,表示询问数 ...
- hdu1542 Atlantis(扫描线+线段树+离散)矩形相交面积
题目链接:点击打开链接 题目描写叙述:给定一些矩形,求这些矩形的总面积.假设有重叠.仅仅算一次 解题思路:扫描线+线段树+离散(代码从上往下扫描) 代码: #include<cstdio> ...
- P3722 [AH2017/HNOI2017]影魔(单调栈+扫描线+线段树)
题面传送门 首先我们把这两个贡献翻译成人话: 区间 \([l,r]\) 产生 \(p_1\) 的贡献当且仅当 \(a_l,a_r\) 分别为区间 \([l,r]\) 的最大值和次大值. 区间 \([l ...
- 51nod 1494 选举拉票 (线段树+扫描线)
1494 选举拉票 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 现在你要竞选一个县的县长.你去对每一个选民进 ...
随机推荐
- day71
上节回顾:(模板层) 1 模板之变量---{{ }} -支持数字,字符串,布尔类型,列表,字典---相当于对它进行了打印 -函数--->相当于加括号运行(不能传参数) -对象---& ...
- jQuery上传文件
1.引入资源 <script src="/yami/backend/backres/js/jquery.min.js"></script> <scri ...
- 微信OAuth2.0网页授权接口
微信OAuth2.0网页授权接口 微信OAuth2.0网页授权接口的thinkphp实现版本号.主要实现了oauth网页受权,以及部分其它接口. 用法 为什么用OAuth2.0受权? 通过OAuth2 ...
- MySQL优化:explain using temporary
什么时候会使用临时表:group/order没设计好的时候 1.order没用索引 2.order用了索引, 但不是和where相同的索引 3.order用了两个索引, 但不是联合索引 4.order ...
- Ubuntu 守护进程
项目中用的Qt开发的GUI程序,需要随机自启动. 最初尝试过使用SuperVisor,但是会出现下面的错误. qt.qpa.screen: QXcbConnection: Could not conn ...
- md5加密,同样的代码得到不同的加密结果(已解决)
场景: 开发环境(windows下)调用第三方接口验签通过,发测试环境(linux下)后死活验签通过不了 原因: md5是一项成熟的加密技术,问题应该在代码里,查了查感觉可能是字符编码的问题,导致加签 ...
- Django实现websocket完成实时通讯、聊天室、在线客服等
一 什么是Websocket WebSocket是一种在单个TCP连接上进行全双工通信的协议 WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据.在WebS ...
- OLEDB数据源和目标组件
在SSIS工程的开发过程中,OLEDB 数据源和目标组件是最常用的数据流组件.从功能上讲,OLEDB 数据源组件用于从OLEDB 提供者(Provider)中获取数据,传递给下游组件,OLEDB提供者 ...
- 分布式Redis缓存串讲(一)
互联网应用的基石 现在流量稍微大些的网站,都会采取Redis.基于Redis的内存缓存特性,可以大幅度降低数据库的访问量,大大提升了网站的并发能力,充当数据库的削量先锋.既然Redis这么重要,我们从 ...
- 【原创】梵高油画用深度卷积神经网络迭代10万次是什么效果? A neural style of convolutional neural networks
作为一个脱离了低级趣味的码农,春节假期闲来无事,决定做一些有意思的事情打发时间,碰巧看到这篇论文: A neural style of convolutional neural networks,译作 ...