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;
    }
  • 相关阅读:
    控件右键菜单的实现以及选中后勾选
    DataGridView控件使用
    return,continue,break的区别
    break和continue的区别 循环终止办法
    事件
    跨线程改变控件属性 线程调用带参数方法
    XML配置文件相关
    抽象类及与接口的区别
    字典
    Oracle学习第一天
  • 原文地址:https://www.cnblogs.com/NeilThang/p/9356605.html
Copyright © 2011-2022 走看看