[PKUSC2018]星际穿越
[PKUSC2018]星际穿越
题目大意:
有一排编号为\(1\sim n\)的\(n(n\le3\times10^5)\)个点,第\(i(i\ge 2)\)个点与\([l_i,i-1]\)之间所有点有双向边。\(q(q\le3\times10^5)\)次询问,每次对于\(l_i,r_i,x_i\),求\(\frac{\sum_{y=l_i}^{r_i}dist(x_i,y)}{r_i-l_i+1}\)。
思路:
首先可以得到一个基本结论,从\(x_i\)出发到\(y\)的最短路中,一定存在至少一种满足路径上有且仅有第一步是向右走的,或者直接往左走。那么我们不妨对于每一个点\(x\),求出\(x\)右侧\(l_i\)最小的\(i=min[x]\),此时\(i\)的覆盖范围一定包含了\(x\)。让\(x\)向\(i\)连边就得到了一个树形结构。在树上每个结点建立主席树维护原图每个点到树上对应结点的距离。
询问时对于\(l_i,r_i,x_i\),若区间\([l_i,r_i]\)内的结点都与\(x_i\)有连边,则答案就是\(r_i-l_i+1\)。否则那些在\(x_i\)连边范围外的那些点到\(x_i\)的距离,就是主席树上到\(min[x_i]\)的距离\(+1\)。到\(min[x_i]\)的距离可以主席树上询问,剩下的\(+1\)一并计算到\(r_i-l_i+1\)中即可。
时间复杂度\(\mathcal O(n\log n)\)。
源代码:
#include<cstdio>
#include<cctype>
#include<algorithm>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
const int N=3e5+1,SIZE=N*30;
int left[N],min[N],par[N];
class SegmentTree {
private:
struct Node {
int left,right,tag,sum;
};
Node node[SIZE];
int sz,new_node(const int &p) {
node[++sz]=node[p];
return sz;
}
public:
int root[N];
void modify(int &p,const int &b,const int &e,const int &l,const int &r) {
p=new_node(p);
if(b==l&&e==r) {
node[p].tag++;
return;
}
node[p].sum+=r-l+1;
const int mid=(b+e)>>1;
if(l<=mid) modify(node[p].left,b,mid,l,std::min(mid,r));
if(r>mid) modify(node[p].right,mid+1,e,std::max(mid+1,l),r);
}
int query(const int &p,const int &b,const int &e,const int &l,const int &r) {
if(!p) return 0;
int ans=node[p].tag*(r-l+1);
if(b==l&&e==r) return ans+node[p].sum;
const int mid=(b+e)>>1;
if(l<=mid) ans+=query(node[p].left,b,mid,l,std::min(mid,r));
if(r>mid) ans+=query(node[p].right,mid+1,e,std::max(mid+1,l),r);
return ans;
}
};
SegmentTree t;
int gcd(const int &a,const int &b) {
return b?gcd(b,a%b):a;
}
int main() {
const int n=getint();
for(register int i=2;i<=n;i++) left[i]=getint();
min[par[n]=n]=left[n];
for(register int i=n-1;i;i--) {
min[i]=std::min(min[i+1],left[i]);
par[i]=par[min[i]]?:i;
}
for(register int i=2;i<=n;i++) {
if(par[i]==i) t.modify(t.root[i]=t.root[min[i]],1,n,1,i-1);
}
for(register int i=2;i<=n;i++) {
t.root[i]=t.root[i]?:t.root[par[i]];
}
for(register int q=getint();q;q--) {
const int l=getint(),r=getint(),x=getint();
int ans=r-l+1;
if(l<left[x]) ans+=t.query(t.root[left[x]],1,n,l,std::min(r,left[x]-1));
const int d=gcd(ans,r-l+1);
printf("%d/%d\n",ans/d,(r-l+1)/d);
}
return 0;
}
[PKUSC2018]星际穿越的更多相关文章
- [Luogu 5465] [LOJ 6435] [PKUSC2018]星际穿越(倍增)
[Luogu 5465] [LOJ 6435] [PKUSC2018]星际穿越(倍增) 题面 n个点的图,点i和[l[i],i)的所有点连双向边.每次询问(l,r,x)表示x到[l,r]的所有点的最短 ...
- BZOJ5371[Pkusc2018]星际穿越——可持久化线段树+DP
题目描述 有n个星球,它们的编号是1到n,它们坐落在同一个星系内,这个星系可以抽象为一条数轴,每个星球都是数轴上的一个点, 特别地,编号为i的星球的坐标是i. 一开始,由于科技上的原因,这n个星球的居 ...
- LOJ.6435.[PKUSC2018]星际穿越(倍增)
LOJ BZOJ 参考这儿qwq. 首先询问都是求,向左走的最短路. \(f[i][j]\)表示从\(i\)走到\(j\)最少需要多少步.表示这样只会\(O(n^2\log n)\)的= =但是感觉能 ...
- [PKUSC2018]星际穿越(倍增)
题意:n个点的图,点i和[l[i],i)的所有点连双向边.每次询问(l,r,x)表示x到[l,r]的所有点的最短路径长度和. 首先这题显然可以线段树优化建图,但是需要比较好的常数才能通过45分,还需要 ...
- 2019.03.09 bzoj5371: [Pkusc2018]星际穿越(主席树)
传送门 题意简述: 给一个序列,对于第iii个位置,它跟[limi,i−1][lim_i,i-1][limi,i−1]这些位置都存在一条长度为111的无向边. 称dist(u,v)dist(u,v) ...
- 【洛谷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们的博客这个题有两种做法 一个是比较费脑子的 ...
- 题解 洛谷 P5465 【[PKUSC2018]星际穿越】
首先考虑题目的性质,发现点向区间连的边为双向边,所以也就可以从一个点向右跳到区间包含该点的点,如图所示: 但事实上向后跳其实是不优的,可以有更好的方法来节省花费: 因此我们发现一个点跳到其前一个区间的 ...
- 「PKUSC2018」星际穿越 (70分做法)
5371: [Pkusc2018]星际穿越 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 27 Solved: 11[Submit][Status] ...
随机推荐
- PKUWC2019爆0记
PKUWC2019爆0记 访问量该骗的还是要骗. 1.20 坐了一天的高铁到jz了,热的一批 1.21 上午开营仪式 下午day1 打开发现有个地主斗 然后开T1 出题人你™搞笑吧放一道sb都能切的题 ...
- 11.11CTF答案
签到题 flag{0ca175b9c0f726a831d895e269332461 } 下载WIN HEX,用WIN HEX打开“海贼王图片”, ...
- Android TextView
常用属性 text:文本框中展示的文字 android:text="下载" android:text="@string/tv_text" ------- ...
- 微信小程序之canvas 文字断行和省略号显示
文字的多行处理在dom元素中很好办.但是canvas中没有提供方法,只有通过截取指定字符串来达到目的. 那么下面就介绍我自己处理的办法: wxml: <canvas canvas-id='wor ...
- js的几大重点
闭包,:作用域(函数创建),上下文环境(函数执行,会销毁) 匿名函数,:没有函数名的函数,function(){} 自执行函数,:立即调用的匿名函数,(function(){})() 原型链,:继承的 ...
- 主机管理+堡垒机系统开发:webssh(十)
一.安装shellinabox 1.安装依赖工具 yum install git openssl-devel pam-devel zlib-devel autoconf automake libtoo ...
- 分布式监控系统开发【day37】:需求讨论(一)
本节内容 为什么要做监控? 常用监控系统设计讨论 监控需求讨论 如何实现监控服务器的水平扩展? 监控系统架构设计 一.为什么要做监控? 熟悉IT监控系统的设计原理 开发一个简版的类Zabbix监控系统 ...
- 面试:atoi() 与 itoa()函数的内部实现(转)
原 面试:atoi() 与 itoa()函数的内部实现 2013年04月19日 12:05:56 王世晖 阅读数:918 #include <stdio.h> #include < ...
- cookie、LocalStorage、sessionStorage三者区别以及使用方式
cookie用来保存客户浏览器请求服务器页面的请求信息 HTML5的WebStorage提供了两种API:localStorage(本地存储)和sessionStorage(会话存储) WebStor ...
- [家里蹲大学数学杂志]第057期图像复原中的改进 TV 模型
$\bf 摘要$: 本文给出了王大凯等编的<图像处理中的偏微分方程方法>第 6.2 节的详细论述. $\bf 关键词$: 图像复原; TV 模型; matlab 编程 1. 前言 图像在形 ...