LOJ.6435.[PKUSC2018]星际穿越(倍增)
参考这儿qwq。
首先询问都是求,向左走的最短路。
\(f[i][j]\)表示从\(i\)走到\(j\)最少需要多少步。表示这样只会\(O(n^2\log n)\)的= =但是感觉能卡过\(70\)分。
注意到从\(i\)出发,走\(j\)步能到达的点都是一段一段的。所以不妨令\(f[i][j]\)表示,从\(i\)出发,走\(j\)步能到达的最左边的是什么。那么\(f[i][j+1]=\min\limits_{k=f[i][j]}^{i-1}L[k]\)。
但是我们还没有考虑向右走的情况。可以发现一条路径最多只会向右走一次。
那么判一下就好惹。这样就可以\(O(n^2)\)啦。
注意到这一过程实际可以倍增:\(f[i][j]\)表示,从\(i\)出发,走\(2^j\)步最左可以到哪。但是还要考虑第一步向右走的情况,所以不妨直接令它表示,\(i\sim n\)这些点走\(2^j\)步最左可以到哪。
记\(Calc(i,p)\)表示,从\(i\)分别走到\(p\sim i\)所有点总共需要走多远。把询问\([l,r]\)拆成\(Calc(i,l)-Calc(i,r+1)\)。
那么再维护一个\(sum[i][j]\)表示,从\(i\)出发,分别走到\(f[i][j]\sim i\)总共需要走多远。那么\(sum[i][j]=sum[i][j-1]+sum[f[i][j-1]][j-1]+(f[i][j]-f[i][j-1])\times2^{j-1}\)。
具体\(Calc\)的时候,关于向右走一步的处理,不妨直接让\(i\)先向左走一步走到\(L[i]\)。这样\(L[i]\)左边的部分都有可能需要\(i\)向右走,但是这正好符合\(f\)的定义,同时我们已经跳了一步也可以看作向右跳了一步。
注意维护一个变量\(tot\)表示之前一共跳过了多少距离。
还有主席树的做法,我不写惹qwq 懒。
//3272ms 68628K / 69284kb 8496ms
#include <cstdio>
#include <cctype>
#include <algorithm>
#define BIT 18
#define gc() getchar()
#define MAXIN 500000
//#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=3e5+5;
int L[N],f[BIT+1][N];
LL sum[BIT+1][N];
char IN[MAXIN],*SS=IN,*TT=IN;
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-48,c=gc());
return now;
}
int Gcd(int a,int b)
{
return b?Gcd(b,a%b):a;
}
LL Calc(int l,int p,const int bit)
{
if(L[p]<=l) return p-l;
LL ans=p-L[p],tot=1; p=L[p];
for(int i=bit; ~i; --i)
if(f[i][p]>=l) ans+=sum[i][p]+(p-f[i][p])*tot, tot+=1<<i, p=f[i][p];
return ans+(p-l)*(tot+1);//(r-l)*tot+r-l
}
int main()
{
const int n=read(); int bit=23;
while(1<<bit>n) --bit;
for(int i=2; i<=n; ++i) L[i]=read();
f[0][n]=L[n];
for(int i=n-1; i; --i) f[0][i]=std::min(f[0][i+1],L[i]), sum[0][i]=i-f[0][i];
for(int j=1; j<=bit; ++j)
{
LL t=1ll<<j-1;
for(int i=1; i<=n; ++i)
f[j][i]=f[j-1][f[j-1][i]], sum[j][i]=sum[j-1][i]+sum[j-1][f[j-1][i]]+(f[j-1][i]-f[j][i])*t;
}
for(int Q=read(); Q--; )
{
int l=read(),r=read(),x=read(),b=r-l+1;
LL a=Calc(l,x,bit)-Calc(r+1,x,bit); int g=Gcd(b,a%b);
printf("%lld/%d\n",a/g,b/g);
}
return 0;
}
LOJ.6435.[PKUSC2018]星际穿越(倍增)的更多相关文章
- [Luogu 5465] [LOJ 6435] [PKUSC2018]星际穿越(倍增)
[Luogu 5465] [LOJ 6435] [PKUSC2018]星际穿越(倍增) 题面 n个点的图,点i和[l[i],i)的所有点连双向边.每次询问(l,r,x)表示x到[l,r]的所有点的最短 ...
- [PKUSC2018]星际穿越(倍增)
题意:n个点的图,点i和[l[i],i)的所有点连双向边.每次询问(l,r,x)表示x到[l,r]的所有点的最短路径长度和. 首先这题显然可以线段树优化建图,但是需要比较好的常数才能通过45分,还需要 ...
- [PKUSC2018]星际穿越
[PKUSC2018]星际穿越 题目大意: 有一排编号为\(1\sim n\)的\(n(n\le3\times10^5)\)个点,第\(i(i\ge 2)\)个点与\([l_i,i-1]\)之间所有点 ...
- LOJ #6435. 「PKUSC2018」星际穿越(倍增)
题面 LOJ#6435. 「PKUSC2018」星际穿越 题解 参考了 这位大佬的博客 这道题好恶心啊qwq~~ 首先一定要认真阅读题目 !! 注意 \(l_i<r_i<x_i\) 这个条 ...
- BZOJ5371[Pkusc2018]星际穿越——可持久化线段树+DP
题目描述 有n个星球,它们的编号是1到n,它们坐落在同一个星系内,这个星系可以抽象为一条数轴,每个星球都是数轴上的一个点, 特别地,编号为i的星球的坐标是i. 一开始,由于科技上的原因,这n个星球的居 ...
- 【洛谷5465】[PKUSC2018] 星际穿越(倍增)
点此看题面 大致题意: 给定\(l_{2\sim n}\),其中\(l_i\)表示\([l_i,i-1]\)的所有点与\(i\)之间存在一条长度为\(1\)的双向路径.每次询问给出\(l,r,x\), ...
- LOJ6435 PKUSC2018 星际穿越
这个题吧当时在考场只得了45分 然后70分的性质都分析到了 不知道为啥就是写萎蛋了 哎 当时还是too young too simple 看了一下julao们的博客这个题有两种做法 一个是比较费脑子的 ...
- 2019.03.09 bzoj5371: [Pkusc2018]星际穿越(主席树)
传送门 题意简述: 给一个序列,对于第iii个位置,它跟[limi,i−1][lim_i,i-1][limi,i−1]这些位置都存在一条长度为111的无向边. 称dist(u,v)dist(u,v) ...
- 题解 洛谷 P5465 【[PKUSC2018]星际穿越】
首先考虑题目的性质,发现点向区间连的边为双向边,所以也就可以从一个点向右跳到区间包含该点的点,如图所示: 但事实上向后跳其实是不优的,可以有更好的方法来节省花费: 因此我们发现一个点跳到其前一个区间的 ...
随机推荐
- (Python3) 九九乘法表 代码
for i in range(1,10): for j in range(1,10): print(i '*' j '=', i*j)
- python3 练手实例7 斐波那契数列
'''a,b=0,1 x=int(input('请指定需要多少项:')) while x>0: print(b) a,b=b,a+b x-=1''' #递归 def fibo(n): if n& ...
- 解决本地SqlServer无法连接远程服务器数据库,错误10060
本地SqlServer 连不上服务器的数据库环境,错误信息如下图,折腾来折腾去,最终还是解决了 第一步 查看服务器本地端口是否已经打开,查看方法:首先向C:\Windows\System32文件夹添加 ...
- 使用Lottie将AE项目转换为 Web 原生动画
使用Lottie转换AE项目为 Web 原生动画 首先打开链接https://github.com/airbnb/lottie-web/blob/master/build/extension/body ...
- day12 函数对象,名称空间与作用域
""" 今日内容: 1.函数参数传值细节 2.三元表达式 3.列表及字典推导式 4.函数对象 5.名称空间与作用域 6.函数的嵌套定义初识 ""&qu ...
- 机器学习基石8-Noise and Error
注: 文章中所有的图片均来自台湾大学林轩田<机器学习基石>课程. 笔记原作者:红色石头 微信公众号:AI有道 上一节课,我们主要介绍了VC Dimension的概念.如果Hypothese ...
- VS2012发布网站详细步骤问题
http://blog.csdn.net/mrobama/article/details/43118387
- SignalR在Asp.NetCore中的使用
SignalR简介 ASP.NET SignalR是为ASP.NET 开发人员提供的一个库,旨在为你的Web应用迅速简便的添加实时通信功能.这个Web通信功能是指:客户端可以实时从服务端代码拉取数据, ...
- 3D 散点图的绘制
一般情况下,我们用到最多的是axes3d() 中的axes3d.Axes3D()类,AxesD() 类下面存在散点图,线性图,柱状图,曲线图等各种制图方式. 采用matplotlib 生成散点图. 一 ...
- netstat、ps、top 、kill 命令备忘
1.ps命令用于显示当前进程 (process) 的状态. -aux 显示所有包含其他使用者的行程. -e 显示所有进程. -f 全格式输出. 一般带参数 -ef 或者 -aux ,差别不大. 区别: ...