zoukankan      html  css  js  c++  java
  • 【倍增】Tak and Hotels II @ABC044&ARC060/upcexam6463

    6463: Tak and Hotels II

    时间限制: 1 Sec  内存限制: 128 MB

    题目描述

    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.

    输入

    The input is given from Standard Input in the following format:
    N
    x1 x2 … xN
    L
    Q
    a1 b1
    a2 b2
    :
    aQ bQ

    输出

    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.

    样例输入

    9
    1 3 6 13 15 18 19 29 31
    10
    4
    1 8
    7 3
    6 7
    8 5
    

    样例输出

    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.

    题意:给你直线上一些点的坐标,一天最大的移动距离,要求每天结束时必须在一个点上。1e5次询问,每次询问从第a个点到第b个点最少要几天。
    solution
    f[x][y]表示第x个点2^y次方的天数能到的最远点。暴力或二分预处理f[x][0],然后 f[x][i] = f[f[x][i-1]][i-1];
    查询的时候, 找到从cur(当前点)出发的第一个小于b位置的f[cur][j],最后答案加上1(2^0)
    code
    #define IN_LB() freopen("C:\Users\acm2018\Desktop\in.txt","r",stdin)
    #define OUT_LB() freopen("C:\Users\acm2018\Desktop\out.txt","w",stdout)
    #define IN_PC() freopen("C:\Users\hz\Desktop\in.txt","r",stdin)
    #include <bits/stdc++.h>
    using namespace std;
      
    typedef long long ll;
    const int maxn = 100005;
    int ind[maxn],lnh,qry;
    const int INF = 1<<30;
    int f[maxn][35];
      
    int main() {
    //    IN_LB();
        int n;
        scanf("%d",&n);
        for(int i=1; i<=n; i++) {
            scanf("%d",ind+i);
        }
        scanf("%d%d",&lnh,&qry);
        for(int i=1; i<=n; i++) {
            int idx = (int)(upper_bound(ind+1,ind+n+1, ind[i]+lnh)-ind-1);
            f[i][0] = idx;
        }
        for(int j=1; j<=30; j++) {
            for(int i=1; i<=n; i++) {
                f[i][j] = f[f[i][j-1]][j-1];
            }
        }
      
        for(int q=0; q<qry; q++) {
            int a,b;
            scanf("%d%d",&a,&b);
            if(a>b)
                swap(a,b);
            int ans = 0,cur = a;
            for(int i=30;i>=0;i--){
                if(f[cur][i]<b){
                    ans+=(1<<(i));
                    cur = f[cur][i];
                }
            }
            printf("%d
    ",ans+1);
        }
        return 0;
    }
  • 相关阅读:
    SharePoint 2013 APP 开发示例 (六)服务端跨域访问 Web Service (REST API)
    麦咖啡导致电脑不能上网
    SharePoint 2013 Central Admin 不能打开
    SharePoint 2013 APP 开发示例 (五)跨域访问 Web Service (REST API)
    SharePoint 2013 APP 开发示例 系列
    synthesize(合成) keyword in IOS
    Git Cmd
    简单的正则匹配
    Dropbox
    SQL Server Replication
  • 原文地址:https://www.cnblogs.com/NeilThang/p/9356605.html
Copyright © 2011-2022 走看看