【PKUSC2018】星际穿越【结论】【倍增dp】

题意:有一张边权为 1 1 1 的无向图,对 i ∈ [ 2 , n ] i\in [2,n] i[2,n] i i i [ l i , i − 1 ] [l_i,i-1] [li,i1] 间有边。 q q q 次询问 l , r , x l,r,x l,r,x,表示 x x x [ l , r ] [l,r] [l,r] 中的所有点的最短路长度的平均值,其中 l < r < x l<r<x l<r<x

n , q ≤ 3 × 1 0 5 n,q\leq 3\times 10^5 n,q3×105

考场上以为只能往左走,喜提 0 分。

首先结论是最多在开始时往右跳一步。如果跳了多步,因为你最终要跳回来,那么一定有一次是跨过了出发点的,因为是双向边,所以不如一次跳到这个点然后往左跳。

先考虑第一步往右的情况,设 p r e ( i , j ) pre(i,j) pre(i,j) 表示从 [ i , n ] [i,n] [i,n] 中任意一点往左跳最多 j j j 步能走到的最左边的点。尽管 [ i + 1 , n ] [i+1,n] [i+1,n] 中有些点可能无法从 i i i 一步跳到,但就意味着这些点还要再跳一次才能跳到 i i i 左边,一定是不优的。

由于第一步可以往左,我们再加一个第一步强制往左的,也就是从 l x l_x lx 开始转移。

发现这个有结合性,所以用倍增优化即可。

复杂度 O ( ( n + q ) log ⁡ n ) \Omicron((n+q)\log n) O((n+q)logn)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#define MAXN 300005
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){return b? gcd(b,a%b):a;}
inline int read()
{
	int ans=0;
	char c=getchar();
	while (!isdigit(c)) c=getchar();
	while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
	return ans;
}
int a[MAXN],pre[MAXN][20];
ll sum[MAXN][20];
ll query(int p,int x)
{
	if (a[x]<=p) return x-p;
	int pos=a[x],cur=1;
	ll ans=x-a[x];
	for (int i=19;i>=0;i--)
		if (pre[pos][i]>=p)
		{
			ans+=sum[pos][i]+(ll)(pos-pre[pos][i])*cur;
			pos=pre[pos][i];
			cur+=(1<<i);
		}
	return ans+(ll)(pos-p)*(cur+1);
}
int main()
{
	int n=read();
	pre[n+1][0]=2e9;
	for (int i=2;i<=n;i++) a[i]=read();
	for (int i=n;i>=1;i--) sum[i][0]=i-(pre[i][0]=min(pre[i+1][0],a[i]));
	for (int j=1;j<20;j++)
		for (int i=1;i<=n;i++)
		{
			pre[i][j]=pre[pre[i][j-1]][j-1];
			sum[i][j]=sum[i][j-1]+sum[pre[i][j-1]][j-1]+(1ll<<(j-1))*(pre[i][j-1]-pre[i][j]);
		}
	for (int q=read();q;q--)
	{
		int l,r,x;
		l=read(),r=read(),x=read();
		ll ans=query(l,x)-query(r+1,x),y=r-l+1;
		ll d=gcd(ans,y);
		ans/=d,y/=d;
		printf("%lld/%lld\n",ans,y);
	}
	return 0;
}
星际穿越》是一部由克里斯托弗·诺兰执导的科幻电影。在这部电影中,地球面临着严重的食物危机和可持续性问题,登陆者接受了一个任务,穿越黑洞寻找适合人类居住的星球。 如果我要用Scratch来描述《星际穿越》这部电影,我会创建一个交互式作品,展示故事的关键场景和情节。首先,我会用Scratch制作一个地球模型,通过展示不断扩大的饥荒和干旱来说明人类面临的食物危机。我还会制作一个角色,代表主人公康威博士,他将带领一队探险家前往未知的星球。 接下来,我会创建一个黑洞的动画,利用Scratch的特效功能来呈现一个漩涡状的黑洞。通过展示人们如何拟合此黑洞,我可以说明故事中所描述的尝试进入黑洞的危险任务。 我还可以用Scratch制作一个飞船模型,描述康威博士和他的队员如何穿越黑洞。通过展示飞船经过曲线轨道、时间变慢等特效,我可以引导观众进入导演所描述的奇幻航行。 最后,我会创造一个新星球的场景,让康威博士和他的队员登陆到一个未知的星球上。我会利用Scratch的绘图功能,绘制一个美丽的星球,并展示队员在这个星球上的探索和挑战。 通过使用Scratch创作《星际穿越》的交互式作品,观众可以更好地理解和感受这部电影所传递的科幻故事。同时,这也是一个很好的机会,来锻炼自己的创造力和Scratch编程能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值