考场上写出了70分,现在填个坑

比较好写的70分是这样的:(我考场上写的贼复杂)

设\(L(i)=\min_{j=i}^nl(j)\)

那么从i开始向左走第一步能到达的就是\([l(i),i-1]\)(显然)

第二步能到达的是\([L(l(i)),l(i)-1]\)

为什么呢,因为i一开始可以直接向左,也可以先向右走到\(l\)最小的位置然后向左,这时能跳到的区间就是\([L(i),i]\)

如果\(L(l(i))=L(i)\)显然这是一种方案,但是有可能\(L(l(i))<L(i)\),既然小了肯定是\(l(k)(k\in[l(i),i))\)这一部分\(<L(i)\),那么当然也是可行的

后面就是\([L(L(\cdots L(l(i))\cdots)),上一个的左端点]\)了,一直推下去。

#include<bits/stdc++.h>
#define il inline
#define vd void
typedef long long ll;
il int gi(){
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-1;
ch=getchar();
}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
int l[300010],L[300010];
ll D[5010][5010];
//D[i][j]表示从i开始到[j,i-1]的跳的次数之和
int main(){
int n=gi();
for(int i=2;i<=n;++i)l[i]=gi();
L[n]=l[n];for(int i=n-1;i>1;--i)L[i]=std::min(l[i],L[i+1]);
for(int i=2;i<=n;++i){
int x=l[i],lst=i;
for(int j=x;j<lst;++j)D[i][j]=1;
int d=1;
while(x!=1){
lst=x;x=L[x];++d;
for(int j=x;j<lst;++j)D[i][j]=d;
}
for(int j=1;j<i;++j)D[i][j]+=D[i][j-1];
}
int q=gi(),l,r,x;
while(q--){
l=gi(),r=gi(),x=gi();
ll A=D[x][r]-D[x][l-1],B=r-l+1,g=std::__gcd(A,B);
printf("%lld/%lld\n",A/g,B/g);
}
return 0;
}

优化很显然是倍增,很容易想到\(f[i][j]\)设为\(i\)位置向前跳\(L(i)\)跳\(2^j\)次。

再来一个\(g[i][j]\)设为\(i\)位置向前跳\(2^j\)次,这中间每个位置跳的次数的和。随便理解一下就行了。



#include<bits/stdc++.h>
#define il inline
#define vd void
typedef long long ll;
il int gi(){
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-1;
ch=getchar();
}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
int l[300010],L[300010];
int f[19][300010];
ll g[19][300010];
il ll solve(int x,int y){
if(l[x]<=y)return x-y;
ll ret=x-l[x];int i,j;
x=l[x];
for(i=18,j=1;~i;--i)
if(f[i][x]>=y){
ret+=g[i][x]+j*(x-f[i][x]);
j+=1<<i;
x=f[i][x];
}
return ret+(x-y)*(j+1);
}
int main(){
int n=gi();
for(int i=2;i<=n;++i)l[i]=gi();
L[n]=l[n];for(int i=n-1;i>1;--i)L[i]=std::min(l[i],L[i+1]);
for(int i=1;i<=n;++i)f[0][i]=L[i],g[0][i]=i-L[i];
for(int i=1;i<19;++i)
for(int j=1;j<=n;++j){
f[i][j]=f[i-1][f[i-1][j]];
g[i][j]=g[i-1][j]+g[i-1][f[i-1][j]]+(1<<i-1)*(f[i-1][j]-f[i][j]);
}
int q=gi(),l,r,x;
while(q--){
l=gi(),r=gi(),x=gi();
ll A=solve(x,l)-solve(x,r+1),B=r-l+1,g=std::__gcd(A,B);
printf("%lld/%lld\n",A/g,B/g);
}
return 0;
}

#6435. 「PKUSC2018」星际穿越的更多相关文章

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

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

  2. LOJ 6435 「PKUSC2018」星际穿越——DP+倍增 / 思路+主席树

    题目:https://loj.ac/problem/6435 题解:https://www.cnblogs.com/HocRiser/p/9166459.html 自己要怎样才能想到怎么做呢…… dp ...

  3. 【LOJ】#6435. 「PKUSC2018」星际穿越

    题解 想出70的大众分之后就弃疗了,正解有点神仙 就是首先有个比较显然的结论,就是要么是一直往左走,要么是走一步右边,然后一直往左走 根据这个可以结合RMQ写个70分的暴力 我们就考虑,最优的话显然是 ...

  4. loj#6435. 「PKUSC2018」星际穿越(倍增)

    题面 传送门 题解 我们先想想,在这个很特殊的图里该怎么走最短路 先设几个量,\(a_i\)表示\([a_i,i-1]\)之间的点都和\(i\)有边(即题中的\(l_i\)),\(l\)表示当前在计算 ...

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

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

  6. 「PKUSC2018」星际穿越(倍增)

    倍增好题啊! 我们我们预处理 \(f[x][i]\) 表示 \(x\) 点最左到达的端点,\(sum[x][i]\) 表示 \(x\) 点最左到达的端点时 \(f[x][i]\sim x\) 的答案, ...

  7. 「PKUSC2018」星际穿越

    传送门 Solution  倍增 Code  #include <bits/stdc++.h> #define reg register #define ll long long usin ...

  8. LOJ #6436. 「PKUSC2018」神仙的游戏(字符串+NTT)

    题面 LOJ #6436. 「PKUSC2018」神仙的游戏 题解 参考 yyb 的口中的长郡最强选手 租酥雨大佬的博客 ... 一开始以为 通配符匹配 就是类似于 BZOJ 4259: 残缺的字符串 ...

  9. LOJ #6432. 「PKUSC2018」真实排名(组合数)

    题面 LOJ #6432. 「PKUSC2018」真实排名 注意排名的定义 , 分数不小于他的选手数量 !!! 题解 有点坑的细节题 ... 思路很简单 , 把每个数分两种情况讨论一下了 . 假设它为 ...

随机推荐

  1. MDT配置数据库

    连接数据库可以使用数据库账户和Windows集成身份验证两种方法:使用数据库账户:1.连接数据库时选择TCP/IP2.在数据库中添加相应规则后,配置数据库3.在CustomSettings.ini文件 ...

  2. 北美PM活着的攻略

    http://www.followmedoit.com/bbs/forum.php?mod=viewthread&tid=47&extra=page%3D1 在北美,做PM不易,需要交 ...

  3. Linux 系统的网络基础_【all】

    网络基础 1.网线:568B: 白橙 橙色 白绿 蓝色 白蓝 绿色 白棕 棕色 2.交换机:电信号转发的网络设备,它可以为接入交换机的任2个网络节点设备提供电信号通信 3.路由器:连接局域网,广域网的 ...

  4. September 08th 2017 Week 36th Friday

    Death is so terribly final, while life is full of possibilities. 死亡是冰冷可怕的绝境,而或者却充满了无限的可能. It isn't t ...

  5. ZT 80-90年代港台300部电视剧 你看过多少?

    80-90年代港台300部电视剧 你看过多少? [复制链接]     噗噗 738主题 18精华 万家金领 发消息   发表于 2010-4-27 09:01:02 |显示全部楼层 1.(珍珠传奇) ...

  6. centos 增加网卡

    CentOS 6添加网卡的方法 (2013-11-26 17:19:44) 转载▼ 标签: it 分类: Linux 前段时间安装了1台XEN server虚拟机,之前只用了1个网卡,ip是10.11 ...

  7. ascii2native 转码 解码

    //把十六进制的编码转为原码function asciiHex2native(strAscii) { var output = ""; var posFrom = 0; var p ...

  8. BZOJ3530:[SDOI2014]数数(AC自动机,数位DP)

    Description 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串.例如当S=(22,333,0233)时,233是幸运数,2333.20233.3 ...

  9. 【转】合格PHP工程师的知识结构

    PHP的运行环境 连环境都搞不起来,就是你有多么喜欢PHP,那也是白搭,开始我们大多会使用集成环境软件例如xampp,wamp.随着知识的增加慢慢要学会自己搭建运行环境,例如 Linux(Ubuntu ...

  10. openresty + orange centos7 安装

    Orange Orange是一个基于OpenResty的API网关.除Nginx的基本功能外,它还可用于API监控.访问控制(鉴权.WAF).流量筛选.访问限速.AB测试.动态分流等.它有以下特性: ...