ARC 060E 高橋君とホテル 倍增+二分
来源:互联网 发布:mac 删除云梯 编辑:程序博客网 时间:2024/05/29 18:11
题意:一条直线上有n个点x[i],x[i+1]-x[i]<=L,操作:每次可以从一个点跳到距离不超过其L的另一个点上.
Q次询问,问从a[j]点跳到b[j]点的最少操作次数?n<=1e5,x[i],L<=1e9
对每个询问:初始为i 令l=i+1,r=b[j] 二分最远能到达的点 最坏情况下O(QNlogN) TLE..
其实每次操作就是把a[i]变到最右边一个满足,r[a[i]]-a[i]<=L.
每次查询就是求最少的r...r(r(a[i]))>=b[i]
设r[k][i] a[i]经过2^k次操作能达到最右边的位置
二分初始化r[0][i],r[k][i]=r[k-1][r[k-1][i]]
查询时,找到最后一个i,r[i][u]<v 令u=r[i][u]继续逼近v.O((N+Q)logN)
#include <bits/stdc++.h>using namespace std;typedef long long ll;typedef pair<int,int> ii;const int N=2e5+20;const int M=5e2+20;const ll inf=2e15;ll n,x[N],L,Q;ll d[30][N];void init(){for(ll i=1;i<=20;i++){for(int j=1;j<=N;j++){d[i][j]=d[i-1][d[i-1][j]];}}}int main(){while(cin>>n){for(int i=1;i<=n;i++)scanf("%I64d",&x[i]);cin>>L>>Q;for(int i=1;i<=n;i++){int l=i+1,r=n;while(l<=r){int mid=(l+r)>>1;if(x[mid]-x[i]<=L)l=mid+1;elser=mid-1;}d[0][i]=l-1;}init();ll u,v;while(Q--){scanf("%I64d%I64d",&u,&v);if(u>v)swap(u,v);ll ans=0;for(ll i=20;i>=0;i--){if(d[i][u]<v)ans+=(1ll<<i),u=d[i][u];}ans++;cout<<ans<<endl;}}return 0;}
阅读全文
0 0
- ARC 060E 高橋君とホテル 倍增+二分
- Codeforces 609E LCA倍增
- ARC 076 E
- Atcoder ARC 077 E
- ARC 083E
- 【运输计划】【二分】【树上倍增】
- 二分新姿势--倍增法
- [练习][bzoj2783]二分+倍增 树
- codeforces 519E 倍增法LCA
- BZOJ 2783 JLOI 2012 树 倍增+二分
- NOIP2012 疫情控制(二分,倍增,贪心)
- noip2012 疫情控制 (二分+倍增)
- hihoCoder1232 Couple Trees LCA倍增算法+二分
- 倍增法+二分 hnu13547 Lily'game
- [HDU 5726] GCD (倍增法+二分)
- 疫情控制(二分+贪心+倍增)
- 【noip2015】【Day2】【二分】【倍增】运输计划
- 玲珑杯-1112 (倍增+二分)
- Quantum3D
- Java newFixedThreadPool监控当前线程的运行状况
- ImageButton与ImageView的区别
- IAR编译常见错误
- php输出数组的最大值和最小值
- ARC 060E 高橋君とホテル 倍增+二分
- 源码分析android的UI绘制流程
- 动态规划之 longest common substring最大公共子串
- springmvc使用原生API
- enum转QString
- Linux-视频监控系统(2)-Epoll的介绍及使用
- 在linux中安装cannal
- 有一种坚持,是我在学习
- ubuntu安装完成后设置root用户密码