这个题吧当时在考场只得了45分 然后70分的性质都分析到了 不知道为啥就是写萎蛋了

哎 当时还是too young too simple

看了一下julao们的博客这个题有两种做法

一个是比较费脑子的倍增做法

一个是比较费体力【大雾 的主席树做法

打死也不写数据结构的我当然还是学第一个啦

首先我们可以分析到要么往右跳一步再往左跳 要么一直往左跳

这个过程我们可以O(n^2)做 通过更新mn[x]就是每个点往左跳最远的位置 这样就可以一步一步往左跳

然后这个过程可以优化一下就是从右往左扫一遍更新先往右跳的 比较好写233

然后我们可以发现这个mn它是一段一段的 所以我们一步一步跳很浪费时间

可以联想到倍增 也就是把一步一步换成2^i步这样 这样可以lgn换掉一个n

所以我们可以用f[x][i]表示x走2^i步最远的位置

我们再来观察题目性质

它每次询问的是x走到一段区间的距离和 这个问题显然是可以差分的

也就是x->[l,r] = x->[l,x] - x->[r+1,x]

我们还可以观察到这个跳跃正反是一样的 于是我们要做的就是求calc(l,x) - calc(r+1,x)

那么我们可以预处理一个s[x][i]数组表示x~f[x][i]这些点跳到f[x][i]的最少步数和

所以我们calc要做的就是[l,x]这些点跳到x的步数和 也可以反过来做就是x象征性的往左跳 然后实际上统计的都是这些点到x的距离【有点拗口 但好像就是这么理解的

然后跳的话。。。就是统计每次2^j跳的和然后加进来就行了

有些小trick放在代码里了 不影响正常理解应该 只是大大缩短了代码量

//Love and Freedom.
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define ll long long
#define inf 20021225
#define N 300010
#define LG 20
using namespace std; int s[N][LG],f[N][LG];
int w[N],n,l,r,x,Q;
int gcd(int x,int y){return y?gcd(y,x%y):x;}
ll calc(int l,int r)
{
if(w[r]<=l) return r-l;
ll ans=r-w[r]; r=w[r]; int tot=;
for(int i=LG-;~i;i--) if(f[r][i]>l)
ans+=s[r][i]+tot*(r-f[r][i]),r=f[r][i],tot+=<<i;
return ans+(r-l)*(tot+);
}
int main()
{
scanf("%d",&n); w[]=;
for(int i=;i<=n;i++) scanf("%d",&w[i]);
f[n][]=w[n]; s[n][]=n-w[n];
for(int i=n-;i;i--) f[i][]=min(f[i+][],w[i]),s[i][]=i-f[i][];
for(int i=;i<LG;i++) for(int j=;j<=n;j++) if(f[j][i-])
f[j][i]=f[f[j][i-]][i-],
s[j][i]=s[j][i-]+s[f[j][i-]][i-]+(f[j][i-]-f[j][i])*(1ll<<(i-));
scanf("%d",&Q);
while(Q--)
{
scanf("%d%d%d",&l,&r,&x);
ll tp=calc(l,x)-calc(r+,x),dn=r-l+;
ll g=gcd(tp%dn,dn);
printf("%lld/%lld\n",tp/g,dn/g);
}
return ;
}

LOJ6435 PKUSC2018 星际穿越的更多相关文章

  1. [PKUSC2018]星际穿越

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

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

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

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

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

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

    LOJ BZOJ 参考这儿qwq. 首先询问都是求,向左走的最短路. \(f[i][j]\)表示从\(i\)走到\(j\)最少需要多少步.表示这样只会\(O(n^2\log n)\)的= =但是感觉能 ...

  5. [PKUSC2018]星际穿越(倍增)

    题意:n个点的图,点i和[l[i],i)的所有点连双向边.每次询问(l,r,x)表示x到[l,r]的所有点的最短路径长度和. 首先这题显然可以线段树优化建图,但是需要比较好的常数才能通过45分,还需要 ...

  6. 2019.03.09 bzoj5371: [Pkusc2018]星际穿越(主席树)

    传送门 题意简述: 给一个序列,对于第iii个位置,它跟[limi,i−1][lim_i,i-1][limi​,i−1]这些位置都存在一条长度为111的无向边. 称dist(u,v)dist(u,v) ...

  7. 【洛谷5465】[PKUSC2018] 星际穿越(倍增)

    点此看题面 大致题意: 给定\(l_{2\sim n}\),其中\(l_i\)表示\([l_i,i-1]\)的所有点与\(i\)之间存在一条长度为\(1\)的双向路径.每次询问给出\(l,r,x\), ...

  8. 题解 洛谷 P5465 【[PKUSC2018]星际穿越】

    首先考虑题目的性质,发现点向区间连的边为双向边,所以也就可以从一个点向右跳到区间包含该点的点,如图所示: 但事实上向后跳其实是不优的,可以有更好的方法来节省花费: 因此我们发现一个点跳到其前一个区间的 ...

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

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

随机推荐

  1. (3)狄泰软件学院C++课程学习剖析一

    深度剖析C++第一部分 1.类是一种模型,这种模型可以创建出一个对应的实体.有了类不一定有对应的实体,但是一个实体必定属于某一个类. 2.类用于抽象的描述 一类事物所持有的属性和行为:对象是具体的事物 ...

  2. ASP汉字转拼音函数的方法

    <% 'ASP汉字转拼音函数 Set d = CreateObject("Scripting.Dictionary") d.add "a",-20319 ...

  3. elk+kafka+zookeeper+filebeat安装

    ElasticSearch6.0 ElasticSearch6.0安装 #依赖jdk8 rpm -ivh elasticsearch-.rpm vim /etc/elasticsearch/elast ...

  4. jsplumb+dragable+vue(一)

    基于vue的jsplumb,支持拖拽生成节点,节点双击展示更多信息,节点连线,删除节点,删除连线,重绘连接图,当前页面刷新连接图,根据json画连接图等功能 本章主要讲 拖拽生成节点 获取链接图的信息 ...

  5. js+html实现玫瑰花绽放

    玫瑰花示例demo: <!DOCTYPE html> <html> <head> <title>玫瑰花</title> <meta c ...

  6. Dpr ppi 适配 等概念 弹性属性的讲解

    Dpr: Dpr的全称(Device pixel ratio)像素设备比例:就是说每个设备像素上占有的css位像素的个数 苹果手机常见的设备像素比:1.0安卓 iPhone2.0  3.0 如果是1. ...

  7. JS-Promise-先上传文件再提交表单

    很久前就使用过 Bootstrap File Input 上传文件,将上传文件返回的信息和表单一并提交回去. 最开始的时候是让用户手动点上传文件,然后再点提交表单: 之后尝试了写在回调里,不过这样会写 ...

  8. day38—JavaScript的运动基础-匀速运动

    转行学开发,代码100天——2018-04-23 一.运动基础框架 JavaScript的运动可以广义理解为渐变效果,直接移动效果等,图网页上常见的“分享到”,banner,透明度变化等.其实现的基本 ...

  9. C语言的未初始化的数组的值为什么是随机的

    突然想起来前几天同学问我为什么没有初始化的数组的值是随机的,发现这个困惑自己也是存在的,所以自己总结的心得. 1. 首先,并不是所有未初始化的数组的值都是随机的.对于没有初始化的数组,分两种情况: ( ...

  10. Vagrant 手册之 Vagrantfile - Vagrant 设置 config.vagrant

    原文地址 配置的命名空间:config.vagrant config.vagrant 中的设置修改 Vagrant 自身的行为. 1. 可用设置 config.vagrant.host 设置运行 Va ...