【PKUSC2018】星际穿越【结论】【倍增dp】
题意:有一张边权为 111 的无向图,对 i∈[2,n]i\in [2,n]i∈[2,n],iii 与 [li,i−1][l_i,i-1][li,i−1] 间有边。 qqq 次询问 l,r,xl,r,xl,r,x,表示 xxx 与 [l,r][l,r][l,r] 中的所有点的最短路长度的平均值,其中 l<r<xl<r<xl<r<x。
n,q≤3×105n,q\leq 3\times 10^5n,q≤3×105
考场上以为只能往左走,喜提 0 分。
首先结论是最多在开始时往右跳一步。如果跳了多步,因为你最终要跳回来,那么一定有一次是跨过了出发点的,因为是双向边,所以不如一次跳到这个点然后往左跳。
先考虑第一步往右的情况,设 pre(i,j)pre(i,j)pre(i,j) 表示从 [i,n][i,n][i,n] 中任意一点往左跳最多 jjj 步能走到的最左边的点。尽管 [i+1,n][i+1,n][i+1,n] 中有些点可能无法从 iii 一步跳到,但就意味着这些点还要再跳一次才能跳到 iii 左边,一定是不优的。
由于第一步可以往左,我们再加一个第一步强制往左的,也就是从 lxl_xlx 开始转移。
发现这个有结合性,所以用倍增优化即可。
复杂度 O((n+q)logn)\Omicron((n+q)\log n)O((n+q)logn)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#define MAXN 300005
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){return b? gcd(b,a%b):a;}
inline int read()
{int ans=0;char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return ans;
}
int a[MAXN],pre[MAXN][20];
ll sum[MAXN][20];
ll query(int p,int x)
{if (a[x]<=p) return x-p;int pos=a[x],cur=1;ll ans=x-a[x];for (int i=19;i>=0;i--)if (pre[pos][i]>=p){ans+=sum[pos][i]+(ll)(pos-pre[pos][i])*cur;pos=pre[pos][i];cur+=(1<<i);}return ans+(ll)(pos-p)*(cur+1);
}
int main()
{int n=read();pre[n+1][0]=2e9;for (int i=2;i<=n;i++) a[i]=read();for (int i=n;i>=1;i--) sum[i][0]=i-(pre[i][0]=min(pre[i+1][0],a[i]));for (int j=1;j<20;j++)for (int i=1;i<=n;i++){pre[i][j]=pre[pre[i][j-1]][j-1];sum[i][j]=sum[i][j-1]+sum[pre[i][j-1]][j-1]+(1ll<<(j-1))*(pre[i][j-1]-pre[i][j]);}for (int q=read();q;q--){int l,r,x;l=read(),r=read(),x=read();ll ans=query(l,x)-query(r+1,x),y=r-l+1;ll d=gcd(ans,y);ans/=d,y/=d;printf("%lld/%lld\n",ans,y);}return 0;
}
【PKUSC2018】星际穿越【结论】【倍增dp】相关推荐
- [Luogu 5465] [LOJ 6435] [PKUSC2018]星际穿越(倍增)
[Luogu 5465] [LOJ 6435] [PKUSC2018]星际穿越(倍增) 题面 n个点的图,点i和[l[i],i)的所有点连双向边.每次询问(l,r,x)表示x到[l,r]的所有点的最短 ...
- 洛谷p5465 [PKUSC2018]星际穿越
[洛谷p5465][PKUSC2018]星际穿越 题面 洛谷 题解 众所周知PKUSC的题大多都不可做,今天好不容易看到1个倍增水题(我猜当时应该全场切了). 我们设\(f[i][j]\)表示\(i\ ...
- LOJ.6435.[PKUSC2018]星际穿越(倍增)
LOJ BZOJ 参考这儿qwq. 首先询问都是求,向左走的最短路. \(f[i][j]\)表示从\(i\)走到\(j\)最少需要多少步.表示这样只会\(O(n^2\log n)\)的= =但是感觉能 ...
- LOJ6435 PKUSC2018星际穿越
Problem loj Solution 一个显而易见的结论,对于一个xi,要到达1号节点的最优路径只有第一步可能往右走,后面的步必定是往左走. 那么我们可以dp出整个右边可以走到的最左边的位置mn[ ...
- LOJ6435 PKUSC2018 星际穿越
这个题吧当时在考场只得了45分 然后70分的性质都分析到了 不知道为啥就是写萎蛋了 哎 当时还是too young too simple 看了一下julao们的博客这个题有两种做法 一个是比较费脑子的 ...
- 【题解】LuoGu5465: [PKUSC2018]星际穿越
原题传送门 重要性质:对于某个点xxx,必定是xxx到[y,x)[y,x)[y,x)中所有点的距离为1,xxx到[z,y)[z,y)[z,y)中所有点距离为2-- (满足z<y<xz< ...
- 「PKUSC2018」星际穿越 (70分做法)
5371: [Pkusc2018]星际穿越 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 27 Solved: 11 [Submit][Statu ...
- 《星际穿越》初解析——一部空前绝后的史诗科学巨作
http://movie.douban.com/review/7188759/ 星际穿越通篇没有一句多余的对白,也没有多余的一个镜头,169分钟超大信息量填满整部电影.这里我打算从两个方面去分析这部电 ...
- 天体物理学-星际穿越
转载自: http://www.cnblogs.com/yangpf/p/4148488.html 确实非常喜欢这样的文章,简单的说明白了很多有意思的科学史.天体物理学啊天体物理学.. 以下是原文 本 ...
- Codeforces Round #717 (Div. 2) D(倍增dp)
Codeforces Round #717 (Div. 2) D 题意:n个数 q个询问,每一个询问有l和r,问你l到r这段区间中最少能分成几段,每一段中的数都是互质的. 思路:首先预处理出每一个点向 ...
最新文章
- 手机号码 与 邮箱验证
- 保存csv时, 不保留index
- Linux getcwd()的实现【转】
- 用js写出水仙花数,JS 水仙花数
- 剑指 Offer 05. 替换空格(两种做法)
- Android Studio 创建/打开项目时一直处于Building“project name”Gradle project info 的解决...
- #36328;#36234;#23457;#26680;#26426;#21046;#30340;gladder#25554;#20214;
- 自助BI项目实施可行性分析报告
- python办公自动化(入门)
- java android实习报告,java和安卓实习报告.pdf
- ubuntu恢复被rm误删的数据及原理
- 导出期刊对应格式的参考_中文参考文献怎么一键导出正确格式?写作必看!
- python随手记自动记账_菜鸟也疯狂!8分钟用Python做一个酷炫的家庭随手记
- php imagejpeg函数,php imagepng()函数有什么用?
- 化妆品用植物干细胞的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- (Java)SortedMap 接口
- mybtisset where tirm 等标签的作用
- arduino控制寻迹传感器
- 基于Qt框架实现的 C/S架构的外卖平台软件系统
- 如何用curl做PUT请求?
热门文章
- 男女共厕,考验男生心理素质的时候到了......
- 带你见识不一样的世界,这5部豆瓣纪录片不可错过!
- 高糊马赛克秒变高清,表情帝:这还是我吗?
- 哈哈哈,程序员没有女朋友的原因,我终于找到了!
- java aop execution_Spring AOP -- execution表达式
- python第k序列元素查找_Python寻找第k小的元素
- java 图片压缩 base64_图片改变像素,宽高,Base64编码处理
- min里所有的参数都不存在_高中生物所有的考点难点,其实都在你不仔细看的课本里,必修1-3超强记忆手册!...
- mysql 5.7.6 5.7.19_MySQL数据库之Mysql 5.7.19 免安装版遇到的坑(收藏)
- java io流 教程_Java基础教程:IO流与文件基础