AtCoder Tak and Hotels

题目链接:传送门

题目大意:有 n 个点排成一条直线,每次行动可以移动不超过 L 的距离,每次行动完成必须停在点上,

     数据保证有解,有 m 组询问,问从 x 到 y 最少需要几次行动?

题目思路:倍增

     dp[i][j] 表示从 j 出发用 (1<<i)次行动可达的最靠左的端点。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <stack>
#include <cctype>
 #include <queue>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <climits>
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r   ///ºê
#define fi first
#define se second
#define ping(x,y) ((x-y)*(x-y))
#define mst(x,y) memset(x,y,sizeof(x))
#define mcp(x,y) memcpy(x,y,sizeof(y))
using namespace std;
#define gamma 0.5772156649015328606065120
#define MOD 1000000007
#define inf 0x3f3f3f3f
#define N 1000005
#define maxn 100005
typedef pair<int,int> PII;
typedef long long LL;

int n,m,k,cnt,L,R,now,last;
int a[maxn];
int dp[20][maxn];

int main(){
    int i,j,x,y,last=1;
    scanf("%d",&n);
    for(i=1;i<=n;++i)scanf("%d",&a[i]);
    scanf("%d",&k);
    for(i=1;i<=n;++i){
        while(a[i]-a[last]>k)++last;
        dp[0][i]=last;
    }
    for(i=1;i<20;++i)
    for(j=1;j<=n;++j)
    dp[i][j]=dp[i-1][dp[i-1][j]];
    scanf("%d",&m);
    while(m--){
        int ans=0;
        scanf("%d%d",&x,&y);
        if(x>y)swap(x,y);
        for(i=16;i>=0;--i){
            if(dp[i][y]>x){
                ans+=(1<<i);
                y=dp[i][y];
            }
        }
        printf("%d\n",ans+1);
    }
    return 0;
}
时间: 2024-09-30 21:11:20

AtCoder Tak and Hotels的相关文章

高橋君とホテル / Tak and Hotels

高橋君とホテル / Tak and Hotels Time limit : 3sec / Stack limit : 256MB / 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 t

csp退役前的做题计划1(真)

csp退役前的做题计划1(真) 因为我太菜了,所以在第一次月考就会退役,还是记录一下每天做了什么题目吧. 任务计划 [ ] Z算法(Z Algorithm) 9.28 [x] ARC061C たくさんの数式 / Many Formulas [x] ARC061D すぬけ君の塗り絵 / Snuke's Coloring [x] ARC061E すぬけ君の地下鉄旅行 / Snuke's Subway Trip [x] ARC061F 3人でカードゲーム / Card Game for Three [

AtCoder-arc060 (题解)

A - 高橋君とカード / Tak and Cards (DP) 题目链接 题目大意: 有 \(n\) 个数字,要求取出一些数字,使得它们的平均数恰好为 \(x\) ,问有几种取法. 大致思路: 只要将每一个数字减掉 \(x\) ,那么问题就变成在 \(n\) 个数字中选取一些数字使得和为 \(0\) 的方案数,是一个经典的 \(dp\) 问题,不过要注意细节问题 代码: #include<bits/stdc++.h> #define ll long long using namespace

2016 ICPC青岛站---k题 Finding Hotels(K-D树)

题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5992 Problem Description There are N hotels all over the world. Each hotel has a location and a price. M guests want to find a hotel with an acceptable price and a minimum distance from their locations.

高橋君とカード / Tak and Cards

高橋君とカード / Tak and Cards Time limit : 2sec / Stack limit : 256MB / Memory limit : 256MB Score : 300 points Problem Statement Tak has N cards. On the i-th (1≤i≤N) card is written an integer xi. He is selecting one or more cards from these N cards, so t

AtCoder Regular Contest 075 E - Meaningful Mean 树状数组求顺序对, 前缀和

题目链接: http://arc075.contest.atcoder.jp/tasks/arc075_c 题意: 给你一个序列和一个数k,求有多少对l,r,使得a[l]+a[l+1]+...+a[r]的算术平均数大于等于k 1≤N≤2×10^5 1≤K≤10^9 1≤ai≤10^9 思路: 首先对于所有数减去k,这样就不用除(r-l+1), 然后我们发现所求的就是有多少对l,r,使得sum[r]-sum[l-1] >= 0, sum是减去k之后的序列的前缀和 用树状数组对sum求有多少个顺序对

POI 2014 HOTELS (树形DP)

题目链接 HOTELS 依次枚举每个点,以该点为中心扩展. 每次枚举的时候,从该点的儿子依次出发,搜完一个儿子所有的点之后进行答案统计. 这里用了一个小trick. 1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 #define rep(i, a, b) for(int i(a); i <= (b); ++i) 6 #define for_edge(i, x) for(int i = H[x]; i; i = X[i]) 7

AtCoder 2346 No Need

传送门:http://arc070.contest.atcoder.jp/tasks/arc070_b?lang=en 题意: 对于一个数组的任意一个子集,如果它的元素和大于等于K这个子集就叫做good subset,如果将一个数所在的所有good subset都减去这个数,这些集合依旧是good subset那么这个数被称为无用数.现在给定一个数组,求其中的无用数的个数.  题解: 如果一个数不是无用数,那么所有大于等于这个数的数都不会是无用数,那么我们先对这个数组进行排序,每次二分结果就行了

Atcoder Yet Another Palindrome Partitioning(状压dp)

Atcoder Yet Another Palindrome Partitioning 思路: 一个字符串满足条件的情况是奇数字母个数小于等于1,也就是异或起来是1<<j(0<=j<=25) 记mark是异或起来的值 状态转移: dp[mark]=dp[mark]+1; dp[mark]=min(dp[mark^(1<<j)]+1,dp[mark]);(0<=j<=25) 注意dp[0]被转移后可能会变成1,但是由它转移的需要dp[0]=0,所以每次记得把d