[LOJ 6435][PKUSC 2018]星际穿越

题意

给定 \(n\) 个点, 每个点与 \([l_i,i-1]\) 之间的点建立有单位距离的双向边. \(q\) 组询问从 \(x\) 走到 \([l,r]\) 中的随机一点的期望距离. 输出既约分数.

\(n,q\le 3\times 10^5\), \(l<r<x\).

题解

显然对于一个 \(k\), \(k\) 步之内能到达的点是 \([1,x)\) 的一个后缀. 那么也就是说 \([1,x)\) 中的点的答案被分成了若干段, 每段的答案相同且向前递增.

手动模拟一下, 我们发现第一步可以走到的左端点是 \(l_x\), 第二步可以走到的就是 \(\min\limits_{k\ge l_x}l_k\) 了. 原因是所有可能一步到达 \(\min\limits_{k\ge l_x}l_k\) 的点都必然可以被 \(x\) 一步到达(如果 \(l_k\) 在 \(k>x\) 处取得最小值, 那么显然 \(l_k<x\). 又由于 \(k\) 连接的是 \([l_k,k)\), 那么必然和 \(x\) 直接相连). 且后面的步骤都是形如 \(l_k\) 的后缀 \(\min\) 的形式.

于是我们可以在第二步及以后尝试倍增.

倍增的同时不仅记录到达的左端点, 同时记录一下倍增时跳过的点的距离总和. 这样就可以在 \(O(\log n)\) 的时间内计算出 \(x\) 到 \([l,x)\) 内的所有点的最短路之和了. 两个后缀和相减即可得到 \([l,r]\) 内的答案.

最后约分一下输出就完了. 虽然最终答案是 \(O(n^2)\) 级别的但是数据比较弱并没有爆 int...

参考代码

#include <bits/stdc++.h>

const int MAXN=3e5+10;

int n;
int q;
int l[MAXN];
int lg[MAXN];
int sum[20][MAXN];
int prev[20][MAXN];
int* minl=prev[0]; int ReadInt();
int Calc(int,int); int main(){
n=ReadInt();
for(int i=2;i<=n;i++)
l[i]=ReadInt();
q=ReadInt();
l[1]=1;
minl[n+1]=n;
for(int i=n;i>=1;i--){
minl[i]=std::min(l[i],minl[i+1]);
sum[0][i]=i-minl[i];
}
for(int i=1;i<=n;i++)
sum[0][i]=i-minl[i];
for(int i=1;(1<<i)<=n;i++){
lg[1<<i]=1;
for(int j=1;j<=n;j++){
prev[i][j]=prev[i-1][prev[i-1][j]];
sum[i][j]=sum[i-1][j]+sum[i-1][prev[i-1][j]]+((prev[i-1][j]-prev[i][j])<<(i-1));
}
}
for(int i=1;i<=n;i++)
lg[i]+=lg[i-1];
for(int i=0;i<q;i++){
int l=ReadInt(),r=ReadInt(),pos=ReadInt();
int a=Calc(pos,l)-Calc(pos,r+1);
int b=r-l+1;
int gcd=std::__gcd(a,b);
printf("%d/%d\n",a/gcd,b/gcd);
}
return 0;
} int Calc(int pos,int lim){
if(l[pos]<lim)
return pos-lim;
int dis=0,p=l[pos],ans=pos-lim;
// printf("x %d %d\n",ans,p);
for(int i=lg[p];i>=0;i--){
if(lim<=prev[i][p]){
ans+=sum[i][p]+(p-prev[i][p])*dis;
// printf("$ %d Q(%d,%d) %d\n",i,pos,lim,ans);
p=prev[i][p];
dis|=(1<<i);
}
}
return ans+(p-lim)*(dis+1);
} inline int ReadInt(){
int x=0;
register char ch=getchar();
while(!isdigit(ch))
ch=getchar();
while(isdigit(ch)){
x=x*10+ch-'0';
ch=getchar();
}
return x;
}

[LOJ 6435][PKUSC 2018]星际穿越的更多相关文章

  1. [LOJ 6433][PKUSC 2018]最大前缀和

    [LOJ 6433][PKUSC 2018]最大前缀和 题意 给定一个长度为 \(n\) 的序列, 求把这个序列随机打乱后的最大前缀和的期望乘以 \(n!\) 后对 \(998244353\) 取膜后 ...

  2. [LOJ 6432][PKUSC 2018]真实排名

    [LOJ 6432][PKUSC 2018]真实排名 题意 给定 \(n\) 个选手的成绩, 选中其中 \(k\) 个使他们的成绩翻倍. 对于每个选手回答有多少种方案使得他的排名不发生变化. \(n\ ...

  3. LOJ #6435. 「PKUSC2018」星际穿越(倍增)

    题面 LOJ#6435. 「PKUSC2018」星际穿越 题解 参考了 这位大佬的博客 这道题好恶心啊qwq~~ 首先一定要认真阅读题目 !! 注意 \(l_i<r_i<x_i\) 这个条 ...

  4. [Luogu 5465] [LOJ 6435] [PKUSC2018]星际穿越(倍增)

    [Luogu 5465] [LOJ 6435] [PKUSC2018]星际穿越(倍增) 题面 n个点的图,点i和[l[i],i)的所有点连双向边.每次询问(l,r,x)表示x到[l,r]的所有点的最短 ...

  5. PKUSC 2018 题解

    PKUSC 2018 题解 Day 1 T1 真实排名 Link Solution 考虑对于每一个人单独算 每一个人有两种情况,翻倍和不翻倍,他的名次不变等价于大于等于他的人数不变 设当前考虑的人的成 ...

  6. 「PKUSC2018」星际穿越 (70分做法)

    5371: [Pkusc2018]星际穿越 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 27  Solved: 11[Submit][Status] ...

  7. [PKUSC2018]星际穿越

    [PKUSC2018]星际穿越 题目大意: 有一排编号为\(1\sim n\)的\(n(n\le3\times10^5)\)个点,第\(i(i\ge 2)\)个点与\([l_i,i-1]\)之间所有点 ...

  8. BZOJ5371[Pkusc2018]星际穿越——可持久化线段树+DP

    题目描述 有n个星球,它们的编号是1到n,它们坐落在同一个星系内,这个星系可以抽象为一条数轴,每个星球都是数轴上的一个点, 特别地,编号为i的星球的坐标是i. 一开始,由于科技上的原因,这n个星球的居 ...

  9. (纪录片)《星际穿越》中的科学 The Science of Interstellar

    简介: 导演: Gail Willumsen编剧: Gail Willumsen主演: 克里斯托弗·诺兰 / 乔纳森·诺兰 / 基普·索恩 / 马修·麦康纳类型: 纪录片 / 短片制片国家/地区: 美 ...

随机推荐

  1. Mixin Messenger 源码解读 1 — — WCDB Swift

    Mixin Messenger 早期采用 FMDB 后来切换至 WCDB 沿用至今,一直比较可靠稳定,这里分享一下使用心得和功能扩展. 关于 Mixin Messenger Mixin Messeng ...

  2. java之三元运算符

    逻辑运算 ? m : n;如果逻辑运算为真,则返回m,否则返回n 实例: 判断i,j两个数的大小,如果a较大,则输出1,否则输出0: 找到i,j,k三个数中的最大值: public class Tes ...

  3. ansible命令参数介绍

    -m:要执行的模块,默认为command -a:模块的参数 -u:ssh连接的用户名,默认用root,ansible.cfg中可以配置 -k:提示输入ssh登录密码.当使用密码验证的时候用 -s:su ...

  4. mysql常用命令杂记

    查看版本 mysqladmin -uRootmaster -pRootmaster@777 versionselect version() 查看Log_bin是否开启 show variables l ...

  5. 深入理解JVM,虚拟机类加载机制

    类加载过程概览 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括以下7个阶段: 加载(Loading) 验证(Verification) 准备(Preparation) 解析(Re ...

  6. 1.springMVC Controller配置方式

    一.手动配置方式 1.web.xml中DispatcherServlet控制器的的配置 SpringMVC也是一种基于请求驱动的WEB框架,并且使用了前端控制器的设计模式.前端控制器就是Dispatc ...

  7. .NET MVC5简介(二)

    MVCApplication---Application_Statr--RegisterRoutes--给RouteCollection添加规则,请求进到网站---X----请求地址被路由按照顺序匹配 ...

  8. newSingleThreadScheduledExecutor连续关闭造成 java.util.concurrent.RejectedExecutionException

    Exception in thread "main" java.util.concurrent.RejectedExecutionException: Task java.util ...

  9. E203 CSR rtl实现分析

    CSR状态控制寄存器,每个hart都有自己的CSR.对于每个hart,可以配置的状态寄存器是4k.CSR寄存器的功能见:https://www.cnblogs.com/mikewolf2002/p/1 ...

  10. iOS 禁用`URL Scheme`和`Universal Link`(通用链接)

    为什么要禁用URL Scheme和Universal Link(通用链接) 通常我们APP中都会嵌套一些web页面,有时我们的web页面会被DNS劫持从而跳转到其他APP中:或者是某些APP的Univ ...