「PKUSC2018」星际穿越

传送门

Solution 

倍增


Code 

#include <bits/stdc++.h>
#define reg register
#define ll long long

using namespace std;

int read() {
    int x = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9') {
        if (ch == '-')
            f = -1;
        ch = getchar();
    }
    while (ch <= '9' && ch >= '0') {
        x = (x << 1) + (x << 3) + ch - '0';
        ch = getchar();
    }
    return x * f;
}

const int MN = 3e5 + 5;

int gcd(int x, int y) { return !y ? x : gcd(y, x % y); }

int N, l[MN];
int p[MN][20], v[MN][20];

int cal(int L, int x) {
    if (L == x)
        return 0;
    if (L >= l[x])
        return x - L;
    int r = x - L, step = 0, i;
    for (x = l[x], i = 18; ~i; --i)
        if (p[x][i] >= L) {
            r += v[x][i] + (x - p[x][i]) * step;
            step += 1 << i;
            x = p[x][i];
        }
    r += (x - L) * (step + 1);
    return r;
}

int main() {
    N = read();
    reg int i, j;
    for (l[1] = 0, i = 2; i <= N; ++i) l[i] = read();
    for (p[N][0] = l[N], i = N - 1; i; --i) p[i][0] = min(l[i], p[i + 1][0]);
    for (j = 1; j <= 18; ++j)
        for (i = 1; i <= N; ++i)
            if (p[i][j - 1])
                p[i][j] = p[p[i][j - 1]][j - 1];

    for (i = 1; i <= N; ++i) v[i][0] = i - p[i][0];
    for (j = 1; j <= 18; ++j)
        for (i = 1; i <= N; ++i)
            if (p[i][j])
                v[i][j] = v[i][j - 1] + v[p[i][j - 1]][j - 1] + (p[i][j - 1] - p[i][j]) * (1 << (j - 1));

    int Q = read(), L, R, x;
    while (Q--) {
        L = read(), R = read(), x = read();
        int P = cal(L, x) - cal(R + 1, x), q = R - L + 1;
        int g = gcd(P, q);
        printf("%d/%d\n", P / g, q / g);
    }
    return 0;
}



Blog来自PaperCloud,未经允许,请勿转载,TKS!

转载于:https://www.cnblogs.com/PaperCloud/p/10910133.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
星际穿越》是一部由克里斯托弗·诺兰执导的科幻电影。在这部电影中,地球面临着严重的食物危机和可持续性问题,登陆者接受了一个任务,穿越黑洞寻找适合人类居住的星球。 如果我要用Scratch来描述《星际穿越》这部电影,我会创建一个交互式作品,展示故事的关键场景和情节。首先,我会用Scratch制作一个地球模型,通过展示不断扩大的饥荒和干旱来说明人类面临的食物危机。我还会制作一个角色,代表主人公康威博士,他将带领一队探险家前往未知的星球。 接下来,我会创建一个黑洞的动画,利用Scratch的特效功能来呈现一个漩涡状的黑洞。通过展示人们如何拟合此黑洞,我可以说明故事中所描述的尝试进入黑洞的危险任务。 我还可以用Scratch制作一个飞船模型,描述康威博士和他的队员如何穿越黑洞。通过展示飞船经过曲线轨道、时间变慢等特效,我可以引导观众进入导演所描述的奇幻航行。 最后,我会创造一个新星球的场景,让康威博士和他的队员登陆到一个未知的星球上。我会利用Scratch的绘图功能,绘制一个美丽的星球,并展示队员在这个星球上的探索和挑战。 通过使用Scratch创作《星际穿越》的交互式作品,观众可以更好地理解和感受这部电影所传递的科幻故事。同时,这也是一个很好的机会,来锻炼自己的创造力和Scratch编程能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值