题目链接 : https://arc060.contest.atcoder.jp/tasks/arc060_c
题目:
E - 高橋君とホテル / Tak and Hotels
Time limit : 3sec / Memory limit : 256MB
Score : 700 points
Problem Statement
N hotels are located on a straight line. The coordinate of the i-th hotel (1≤i≤N) is xi.
Tak the traveler has the following two personal principles:
- He never travels a distance of more than L in a single day.
- He never sleeps in the open. That is, he must stay at a hotel at the end of a day.
You are given Q queries. The j-th (1≤j≤Q) query is described by two distinct integers aj and bj. For each query, find the minimum number of days that Tak needs to travel from the aj-th hotel to the bj-th hotel following his principles. It is guaranteed that he can always travel from the aj-th hotel to the bj-th hotel, in any given input.
Constraints
- 2≤N≤105
- 1≤L≤109
- 1≤Q≤105
- 1≤xi<x2<…<xN≤109
- xi+1−xi≤L
- 1≤aj,bj≤N
- aj≠bj
- N, L, Q, xi, aj, bj are integers.
Partial Score
- 200 points will be awarded for passing the test set satisfying N≤103 and Q≤103.
Input
The input is given from Standard Input in the following format:
N
x1 x2 … xN
L
Q
a1 b1
a2 b2
:
aQ bQ
Output
Print Q lines. The j-th line (1≤j≤Q) should contain the minimum number of days that Tak needs to travel from the aj-th hotel to the bj-th hotel.
Sample Input 1
Copy
9
1 3 6 13 15 18 19 29 31
10
4
1 8
7 3
6 7
8 5
Sample Output 1
Copy
4
2
1
2
For the 1-st query, he can travel from the 1-st hotel to the 8-th hotel in 4 days, as follows:
- Day 1: Travel from the 1-st hotel to the 2-nd hotel. The distance traveled is 2.
- Day 2: Travel from the 2-nd hotel to the 4-th hotel. The distance traveled is 10.
- Day 3: Travel from the 4-th hotel to the 7-th hotel. The distance traveled is 6.
- Day 4: Travel from the 7-th hotel to the 8-th hotel. The distance traveled is 10.
题意:给你n个点 然后给你每个点的坐标(抽象成一条直线) 给你每天走的最远的距离L 和 Q次询问 输出每次询问中L点到R点的最少天数,如果暴力的话就是Q*N*lgN 每次问询 * 最短时间 TLE
然后看到别人写的是倍增+二分 就是提前预处理好2^x天数可达的最远距离
可以用dp求解 dp[i][j] = dp[dp[i][j-1]][j-1] 就是第i个点第2^j天 等于 第i个点第2^(j-1)天到达的点 第2^(j-1)天的位置
2^j = 2^(j-1) * 2 = 2^(j-1) + 2^(j-1);
先预处理2^0天的时间就是第一天可达的最远距离 所以最后结果需要+1
最后求结果的时候从后往前找到L可达的最远小于等于R的某点~~~~~~然后不断的求X-R的最短时间 求和即可
最后这样做的时间复杂度是(Q+N)*30 3e6
#include<bits/stdc++.h>
using namespace std;
int a[100005];
int dp[100005][50];
int main()
{
int n;
scanf("%d",&n);
for(int i = 1;i <= n;i++)
scanf("%d",&a[i]);
int L,Q;
scanf("%d%d",&L,&Q);
for(int i = 1;i <= n;i++)
{
int id = upper_bound(a+1,a+1+n,a[i]+L)-a-1;
if(a[i] + L >= a[n])
dp[i][0] = n;
else
dp[i][0] = id;
}
for(int i = 1;i <= 30;i++)
{
for(int j = 1;j <= n;j++)
dp[j][i] = dp[dp[j][i-1]][i-1];
}
while(Q--)
{
int L,R;
scanf("%d%d",&L,&R);
if(R<L)
swap(L,R);
long long ans=0;
for(int i = 30;i >= 0;i--)
{
if(dp[L][i] < R)
{
ans=ans+(1ll<<i);
L = dp[L][i];
}
}
printf("%lld\n",ans+1);
}
return 0;
}