[PKUSC2018]星际穿越(倍增)
题意:n个点的图,点i和[l[i],i)的所有点连双向边。每次询问(l,r,x)表示x到[l,r]的所有点的最短路径长度和。
首先这题显然可以线段树优化建图,但是需要比较好的常数才能通过45分,还需要发掘性质。
先不考虑往右走的情况,对于一个点x,每个点i与x的最短距离一定形成一个个连续区间,即:设f[i][j]表示i走j步能到的最左的点,则$f[i][j+1]=\min\limits_{k=f[i][j]}^{i-1}l[k]$。所以只要往前扫一遍就能求出f[i]数组。
接着考虑往右走的情况,可以证明,一个点最多只需要往右走一次,所以只需要往后扫一遍就能求出新的f[i]数组。这样我们记录一个前缀和就可以在$O(n^2)$复杂度内解决问题。
可以发现f[i][j]这个数组显然是可以倍增优化的,直接套上RMQ类似的模板即可。
这里有一个简化代码的方法,就是f[i][j]改为表示[i..n]的所有点走$2^j$步之后能到达的最靠前的点,这样就可以直接倍增转移了。但是这样就要判断i最后是否需要先往右走一步,这里又有一个小技巧:先强制往左走一步,剩下的直接处理即可。
总码长不到1k。
#include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
typedef long long ll;
using namespace std; const int N=;
int n,Q,l,r,x,L[N],to[][N];
ll sm[][N]; int gcd(int a,int b){ return b ? gcd(b,a%b) : a; } ll calc(int l,int r){
if (L[r]<=l) return r-l;
ll ans=r-L[r]; r=L[r]; int tot=;
for (int i=; ~i; i--)
if (to[i][r]>l) ans+=sm[i][r]+tot*(r-to[i][r]),r=to[i][r],tot+=<<i;
return ans+(r-l)*(tot+);
} int main(){
freopen("pkua.in","r",stdin);
freopen("pkua.out","w",stdout);
scanf("%d",&n); L[]=;
rep(i,,n) scanf("%d",&L[i]);
to[][n]=L[n]; sm[][n]=n-L[n];
for (int i=n-; i; i--) to[][i]=min(to[][i+],L[i]),sm[][i]=i-to[][i];
rep(i,,) rep(j,,n) if (to[i-][j]){
to[i][j]=to[i-][to[i-][j]];
sm[i][j]=sm[i-][j]+sm[i-][to[i-][j]]+(to[i-][j]-to[i][j])*(1ll<<(i-));
}
for (scanf("%d",&Q); Q--; ){
scanf("%d%d%d",&l,&r,&x);
ll a=calc(l,x)-calc(r+,x),b=r-l+; int d=gcd(a%b,b);
printf("%lld/%lld\n",a/d,b/d);
}
return ;
}
[PKUSC2018]星际穿越(倍增)的更多相关文章
- [Luogu 5465] [LOJ 6435] [PKUSC2018]星际穿越(倍增)
[Luogu 5465] [LOJ 6435] [PKUSC2018]星际穿越(倍增) 题面 n个点的图,点i和[l[i],i)的所有点连双向边.每次询问(l,r,x)表示x到[l,r]的所有点的最短 ...
- LOJ.6435.[PKUSC2018]星际穿越(倍增)
LOJ BZOJ 参考这儿qwq. 首先询问都是求,向左走的最短路. \(f[i][j]\)表示从\(i\)走到\(j\)最少需要多少步.表示这样只会\(O(n^2\log n)\)的= =但是感觉能 ...
- [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]星际穿越】
首先考虑题目的性质,发现点向区间连的边为双向边,所以也就可以从一个点向右跳到区间包含该点的点,如图所示: 但事实上向后跳其实是不优的,可以有更好的方法来节省花费: 因此我们发现一个点跳到其前一个区间的 ...
随机推荐
- 用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建三:配置spring并测试
这一部分的主要目的是 配置spring-service.xml 也就是配置spring 并测试service层 是否配置成功 用IntelliJ IDEA 开发Spring+SpringMVC+M ...
- Spring Boot的事务处理
spring boot大大简化了之前java项目需要在配置xml里设置很多繁琐的内容. 设置数据源和配置事务 @Bean(name = "masterDataSource") @P ...
- JAVA WEB开发环境与搭建
一:jdk下载与安装 (1)官网下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-506665 ...
- 使用FFMPEG进行一些视频处理(C#)视频合并、转码、获取时长
FFMPEG的强大无需多说,举几个用到的功能,直接贴代码了 还有更多命令用到时搜索即可 视频转码 ) { var args = "-y -i {0} -vcodec copy {1}&quo ...
- Gaussian Process for Regression
python风控评分卡建模和风控常识(博客主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005214003&am ...
- Pandas系列(二)- DataFrame数据框
一.初识DataFrame dataFrame 是一个带有索引的二维数据结构,每列可以有自己的名字,并且可以有不同的数据类型.你可以把它想象成一个 excel 表格或者数据库中的一张表DataFram ...
- Git 分支(一)简介&创建分支
理解Git暂存区 文件.git/index是一个包含文件索引的目录树,像是一个虚拟的工作区.在这个虚拟工作区的目录树中,记录了文件名和文件的状态信息.以便快速检测文件的变化. ...
- 第二节. SignalR开篇以及如何指定传输协议
一. 声明 该节主要介绍SignalR的一些理论知识,代码量很小,在后续章节编写中,会不断回来更新该节,完善该节的介绍:待该系列结束时,该节会和目录章节合并. 下面的理论介绍相对枯燥,但对于后面的理解 ...
- luogu P5287 [HNOI2019]JOJO
传送门 神™这题暴力能A,这出题人都没造那种我考场就想到的数据,难怪我的垃圾做法有分 先考虑没有撤销操作怎么做,因为每次插入一段一样的字符,所以我们可以把\(x\)个字符\(c\)定义为\(cx\), ...
- Thread和Runnable的区别
Runnable源码 Thread源码 结论 Thread实现了Runnable接口的类,使得run支持多线程. 因类的单一继承原则,推荐使用Runnable接口实现多线程