题目链接:
loj6435
洛谷5465

蒟蒻zyd:这不是大水题吗?看我写个O(nlog2n)O(nlog^2n)O(nlog2n)的诡异ST表卡卡常数跑过去
题目:输出区间距离和
蒟蒻zyd:(笑容逐渐消失)

没想到一道倍增题能这么巧(毒)妙(瘤)……

一些奇奇怪怪的性质

这里是需要用到的性质……
为了方便,这里把“花费1单位时间进行传送”称为“走了1步”qwq
Ps.一些类似的情况就不画图了……我不会说其实是我懒QWQ

性质1

假设起始点是sss,如果当前走了ttt步,能到达的最左端的点是xxx,那么一定能在ttt步内从sss到达[x,s−1][x,s-1][x,s−1]内的任意一点。

证明:如果某个点ppp(x≤p<sx\le p <sx≤p<s)不能到达,因为某个点向左连接的点是连续的一段,所以sss能到的点中的lll的最小值一定>p>p>p(否则就珂以到ppp了qwq),所以无法从sss能到的点中的任意一点走到ppp左边,就矛盾了qwq

为什么能在ttt步内到达呢?类似地,比如要t+1t+1t+1步才能到ppp,那么也不能在ttt步内到达ppp左边(不然从ttt步内走到ppp左边的点走到ppp即可qwq),矛盾qwq
所以得证。

性质2

假设起点是sss,终点是xxx,那么sss到xxx的最短路只能是这两种之一:
1.一直向左走
2.一开始先从sss向右走一步,再一直向左走。
换言之,如果要向右走,只能一开始向右一步,其他时候就只能向左走了。
先证明不存在从sss向右走两步的情况:
设sss走两次到xxx,走一次到yyy。若存在l[x]<l[y]l[x]<l[y]l[x]<l[y],即向右走两步比向右走一步更优的情况:
(如图所示,蓝边是xxx到l[x]l[x]l[x]连的边)

由于一个点向左连的边的编号是连续的一段,所以sss一定有一条边连向xxx,因此sss能一步就到xxx,因此更优。
(如图所示,sss能通过红边一步到达xxx)

若不存在l[x]<l[y]l[x]<l[y]l[x]<l[y]的情况,那没必要走两步到xxx了qwq,直接到yyy然后向左走就珂以了qwq

再证明不能中途向右走的情况:
设起点sss向右走一步能到达的最右边的点是r(x)r(x)r(x),现在走到了xxx,如果要向右走,那么到达的点也一定在[x+1,r(s)][x+1,r(s)][x+1,r(s)]范围内。
如果走到的点>r(x)>r(x)>r(x),假设这个点为yyy,那么l[y]l[y]l[y]一定比sss小,所以sss珂以向右走一步到达yyy,但y>r(x)y>r(x)y>r(x),矛盾,所以xxx向右走能到达的点在[x+1,r(s)][x+1,r(s)][x+1,r(s)]范围内qwq
根据性质1,向右走一步不会让答案更优,所以就不用往右走了qwq
(其实性质1只证明了[x,s][x,s][x,s]范围内不会使答案更优,但是脑补一下也珂以明白在[s+1,r(s)][s+1,r(s)][s+1,r(s)]范围内也成立qwq)

综上,如果要向右走,那只能一开始向右走一步。

Ps. 有一个很显然的性质我感觉不用证明……就不把它列到上面正经证明的性质了awa
即:如果前ttt步能到达的范围是[L,R][L,R][L,R],那么第t+1t+1t+1不能到达的范围是min{l[i]},L<=i<=Rmin\{l[i]\},L<=i<=Rmin{l[i]},L<=i<=R

题目解析

倍增:
f[i][j]f[i][j]f[i][j]表示从iii开始,先向右一次,再向左2j2^j2j次所能到达的最左端的点。
那么f[i][j]=f[f[i][j−1]][j−1]f[i][j]=f[f[i][j-1]][j-1]f[i][j]=f[f[i][j−1]][j−1]
因为由性质2,中途向右走不会使答案更优,所以从f[i][j−1]f[i][j-1]f[i][j−1]向左2j−12^{j-1}2j−1步即为f[i][j]f[i][j]f[i][j]
显然向左走x+1x+1x+1步会比向左xxx步走得远,所以倍增数组是单调的。
查询就搞一个sum[i][j]sum[i][j]sum[i][j],表示iii到[f[i][j],i][f[i][j],i][f[i][j],i]的点的距离和qwq
然后大莉统计即珂(走出2i2^i2i步的贡献分两个部分统计)
具体见代码qwq

毒瘤代码

#include<stdio.h>
#include<cstring>
#include<algorithm>
#define re register int
using namespace std;
typedef long long ll;
int read() {re x=0,f=1;char ch=getchar();while(ch<'0' || ch>'9') {if(ch=='-')  f=-1;ch=getchar();}while(ch>='0' && ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;
}
inline void write(const int x) {if(x>9)  write(x/10);putchar(x%10+'0');
}
const int Size=300005;
const int INF=0x3f3f3f3f;
int n,l[Size],LOG[Size],f[Size][21],sum[Size][21];
int Calc(int x,int pos) {if(l[pos]<=x)  return pos-x;int ans=pos-l[pos];       //先向左跳一次 pos=l[pos];int cnt=1;//跳到再跳一次就<x的位置 for(re i=LOG[pos]; i>=0; i--) {if(f[pos][i]>x) {//f[pos][i]~pos到pos的距离和+pos到原点的距离*这段区间的个数 ans+=sum[pos][i]+(pos-f[pos][i])*cnt;pos=f[pos][i];cnt+=1<<i;}}return ans+(pos-x)*(cnt+1);
}
int main() {n=read();LOG[0]=-1;LOG[1]=0;for(re i=2; i<=n; i++) {l[i]=read();LOG[i]=LOG[i>>1]+1;}f[n+1][0]=INF;for(re i=n; i; i--) {f[i][0]=min(f[i+1][0],l[i]);sum[i][0]=i-f[i][0];        //跳一步就珂以,所以距离和为区间点数 }for(re j=1; j<=18; j++) {for(re i=1<<j; i<=n; i++) {if(f[i][j-1]) {f[i][j]=f[f[i][j-1]][j-1];sum[i][j]=sum[i][j-1]+sum[f[i][j-1]][j-1]+((f[i][j-1]-f[i][j])<<(j-1));}}}int q=read();while(q--) {int l=read();int r=read();int x=read();int p=Calc(l,x)-Calc(r+1,x);int q=r-l+1;int k=__gcd(p,q);printf("%d/%d\n",p/k,q/k);}return 0;
}

LOJ6435 洛谷5465 「PKUSC2018」星际穿越 倍增相关推荐

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

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

  2. 洛谷P4710 「物理」平抛运动 普及-

    P4710 「物理」平抛运动 标签:数学 思路:开始卡了,g=9.8不能,改为10就过了 题目描述 小 F 回到班上,面对自己 28 / 110 的物理,感觉非常凉凉.他准备从最基础的力学学起. 如图 ...

  3. LOJ 2312(洛谷 3733) 「HAOI2017」八纵八横——线段树分治+线性基+bitset

    题目:https://loj.ac/problem/2312 https://www.luogu.org/problemnew/show/P3733 原本以为要线段树分治+LCT,查了查发现环上的值直 ...

  4. 洛谷 P5858 「SWTR-03」Golden Sword

    Description 制造一把金宝剑需要 n n n 种原料,编号为 1 1 1 到 n n n,编号为 i i i 的原料的坚固值为 a i a_i ai​. 炼金是很讲究放入原料的顺序的,因此小 ...

  5. 洛谷P6599 「EZEC-2」异或【题解】

    题目大意 有TTT组数据,每组数据给定两个l,n∈N∗l,n\in\mathbb{N*}l,n∈N∗,构造一个长为lll,每个元素不超过nnn的数组 令他为aaa,要使 ∑i=1l∑j=1i−1ai⊕ ...

  6. 「PKUSC2018」神仙的游戏 - 题解

    「PKUSC2018」神仙的游戏 题意:给出一个01?串,其中?可以代替成为0或1,令 $ F(i) $ 表示是否存在长度为 $ i $ 的border,求 $ (F(1) \times 1 \tim ...

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

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

  8. 「LuoguP4995」「洛谷11月月赛」 跳跳!(贪心

    题目描述 你是一只小跳蛙,你特别擅长在各种地方跳来跳去. 这一天,你和朋友小 F 一起出去玩耍的时候,遇到了一堆高矮不同的石头,其中第 ii 块的石头高度为 h_ihi​,地面的高度是 h_0 = 0 ...

  9. LOJ 3049: 洛谷 P5284: 「十二省联考 2019」字符串问题

    题目传送门:LOJ #3049. 题意简述: 给定一个长度为 \(n\) 的母串 \(S\). 有 \(n_a\) 个 A 类串,都是 \(S\) 的子串,以区间的形式给出. 有 \(n_b\) 个 ...

最新文章

  1. XenDesktop中无法删除虚拟机
  2. 用 Flask 来写个轻博客 (23) — 应用 OAuth 来实现 Facebook 第三方登录
  3. Unity-2017.2官方实例教程Roll-a-ball(一)
  4. Hadoop分布式文件系统hdfs的shell操作命令大全
  5. C语言学习之购房从银行贷了一笔款d,准备每月还款额为p,月利率为r,计算多少月能还清。
  6. Java 类的特性2
  7. MongoDB:使用Spring数据添加计数器
  8. java错误switch找不到符号,Java使用StringBuilder时--找不到符号
  9. 单片机集成wifi等_从零制作单片机需要哪些知识?
  10. python壁纸数据抓取_python 多线程爬取壁纸网站的示例
  11. 大数据_Flink_流式处理_简介_Flink是什么---Flink工作笔记0001
  12. python easygui进度条_Python模块EasyGui专题学习
  13. 【Pix4d精品教程】Pix4Dmapper完整航测内业操作流程手把手图文教程
  14. 内存cpu占用不高但mysql很卡_为什么cpu占用率不高,内存也不高,电脑会卡
  15. 数据分析师必须掌握的模型——AARRR漏斗模型
  16. Excel表格中排名函数
  17. 计算机专业大学生应该怎么规划未来?
  18. Hive 数据迁移与备份
  19. 月经帖 | 2019.11
  20. 基于SVM的数字手势识别模型

热门文章

  1. 北京妙趣横生网络科技有限公司笔试和面试通知
  2. 妙趣横生的算法--顺序表
  3. PT100高精度测温电路 AD623+REF3030(很稳定)
  4. 西电计网期末复习要点+iPad手写笔记
  5. 刚体验完华为P20 Pro,这位巴黎的珠宝设计师立刻献上了膝盖
  6. 树莓派 实时温度监控
  7. 微信小程序java开发流程分享
  8. 计算机管理员怎么说的高大上,高大上的档案管理系统界面是如何设计的?答案在这里...
  9. c语言文件中筛选字符,用c语言实现文本文件中的字符筛选分析(一)
  10. 区块链应用创新的加速器 - 阿里云容器服务区块链解决方案