Codeforces 1175E(倍增)

要点

  • cf 1168C相似的一点都是看某点x最远能拓展到哪里
  • 看数据想要在logn内查询,考虑倍增步数
const int maxn = 2e5 + 5, X = 5e5 + 5, LOG = 25;
int n, m;
int l, r;
int dp[X][LOG];//点i走pow(2, j)步最远到达的点

int main() {
    read(n), read(m);
    rep(i, 1, n) {
        read(l), read(r);
        dp[l][0] = max(dp[l][0], r);//会被更新
    }
    rep(i, 1, X - 5) {
        dp[i][0] = max(dp[i][0], dp[i - 1][0]);
    }
    rep(i, 1, 20)
        rep(j, 0, X - 5)//倍增
            dp[j][i] = dp[dp[j][i - 1]][i - 1];
    rep(i, 1, m) {
        read(l), read(r);
        int ans = 0;
        per(j, 20, 0)
            if (dp[l][j] < r) {//要写小于;走2^20步最远能到r:2^1就到了,后面19次都是空步
                ans += 1 << j;
                l = dp[l][j];
            }
        if (ans <= n)   writeln(ans + 1);//最后一步
        else    writeln(-1);
    }
    return 0;
}

转载于:https://www.cnblogs.com/AlphaWA/p/11012974.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值