博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2019 徐州icpc网络赛 E. XKC's basketball team
阅读量:5124 次
发布时间:2019-06-13

本文共 1416 字,大约阅读时间需要 4 分钟。

题库链接:

题目大意

给定n个数,与一个数m,求ai右边最后一个至少比ai大m的数与这个数之间有多少个数

思路

对于每一个数,利用二分的方法求他右边大于等于ai+m的数的最后一个值。

关键在于怎么二分呢?

利用线段树存储区间最大值,看这个区间的最大值是不是比ai+m大

代码:

#include
using namespace std;#define maxn 1000005#define mod 1000000007int a[maxn];struct node{ int l,r,ma;}tree[maxn*4];void build(int l,int r,int p){ tree[p].l = l; tree[p].r = r; tree[p].ma = -1; if(l == r) { tree[p].ma = a[l]; return; } int mid = (l+r)/2; build(l,mid,p*2); build(mid+1,r,p*2+1); tree[p].ma = max(tree[p*2].ma,tree[p*2+1].ma);}int query(int x,int y,int p){ if(x == tree[p].l && y == tree[p].r) return tree[p].ma; int mid = (tree[p].l + tree[p].r)/2; if(x > mid) return query(x,y,p*2+1); else if(y <= mid) return query(x,y,p*2); else return max(query(x,mid,p*2),query(mid+1,y,p*2+1)); }int main(){ int T,i,j,k,n,q,x,y,m,s,l,r,mid; scanf("%d%d",&n,&m); for(i=1;i<=n;++i) scanf("%d",&a[i]); build(1,n,1); for(i=1;i
=s) { l=mid; } else if(query(l,mid,1)>=s) { r=mid-1; } else { break; } } if(a[l]>=s) cout<
<<' '; else cout<<"-1"<<' '; } cout<<"-1"<

 

转载于:https://www.cnblogs.com/dyhaohaoxuexi/p/11484004.html

你可能感兴趣的文章
js和layerjs配合实现的拖拽表格列
查看>>
Spring MVC集成slf4j-logback
查看>>
java常量池
查看>>
URL类
查看>>
flask(精讲)
查看>>
Java异常处理原则与技巧总结
查看>>
springboot快速入门
查看>>
wget 命令用法详解
查看>>
方法的重写
查看>>
自定义注解
查看>>
HashMap面试题
查看>>
why I need a flow learn note.
查看>>
ASP.NET WebForm中使用WebApi
查看>>
js学习总结----编写简单的ajax方法库
查看>>
js学习总结----柯里化函数
查看>>
Knozen:新型职场社交评论匿名应用,已获多家风投投资
查看>>
第三次个人赛题目2 【多项式输出格式】
查看>>
剑指offer 重建二叉树
查看>>
排序算法之冒泡排序
查看>>
so打包进APK
查看>>