传送门

题意简述:

给一个序列,对于第iii个位置,它跟[limi,i−1][lim_i,i-1][limi​,i−1]这些位置都存在一条长度为111的无向边。

称dist(u,v)dist(u,v)dist(u,v)表示(u,v)(u,v)(u,v)间最短路长度。

qqq次询问,每次给出l,r,xl,r,xl,r,x,求∑i=lrdist(i,x)\sum_{i=l}^rdist(i,x)∑i=lr​dist(i,x)


思路:

有一个显然的结论,从iii走到它之前的点,要么向右边走一次之后一直向左走,要么一直向左走。

对每个点dpdpdp出它最多向右边走一次然后向左走一步能够到达的最小编号,称为mnimn_imni​。

这样对于编号在[limi,i−1][lim_i,i-1][limi​,i−1]间的点只用直接走一次,对于编号在[1,limi−1][1,lim_i-1][1,limi​−1]的点可以先走到mnimn_imni​,然后走到iii,这样用主席树维护[1,i−1][1,i-1][1,i−1]到iii的最短距离,iii对应的线段树用mnimn_imni​的更新过来即可。

提示:bzoj轻微卡主席树,最好用fread优化

代码:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int rlen=1<<18|1;
inline char gc(){
	static char buf[rlen],*ib,*ob;
	(ib==ob)&&(ob=(ib=buf)+fread(buf,1,rlen,stdin));
	return ib==ob?-1:*ib++;
}
inline int read(){
	int ans=0;
	char ch=gc();
	while(!isdigit(ch))ch=gc();
	while(isdigit(ch))ans=((ans<<2)+ans<<1)+(ch^48),ch=gc();
	return ans;
}
const int N=3e5+5;
int rt[N],lim[N],n,mn[N];
inline int gcd(int a,int b){while(b){int t=a;a=b,b=t-t/a*a;}return a;}
namespace SGT{
	#define lc (son[p][0])
	#define rc (son[p][1])
	#define mid (l+r>>1)
	int sum[N*30],add[N*30],son[N*30][2],tot=0;
	inline void update(int&p,int l,int r,int ql,int qr){
		int o=++tot;
		sum[o]=sum[p],add[o]=add[p],son[o][0]=lc,son[o][1]=rc;
		p=o;
		if(ql<=l&&r<=qr){++add[p];return;}
		sum[p]+=min(qr,r)-max(ql,l)+1;
		if(qr<=mid)update(lc,l,mid,ql,qr);
		else if(ql>mid)update(rc,mid+1,r,ql,qr);
		else update(lc,l,mid,ql,mid),update(rc,mid+1,r,mid+1,qr);
	}
	inline int query(int p,int l,int r,int ql,int qr){
		if(!p)return 0;
		int ret=add[p]*(min(qr,r)-max(ql,l)+1);
		if(ql<=l&&r<=qr)return sum[p]+ret;
		if(qr<=mid)return query(lc,l,mid,ql,qr)+ret;
		if(ql>mid)return query(rc,mid+1,r,ql,qr)+ret;
		return query(lc,l,mid,ql,mid)+query(rc,mid+1,r,mid+1,qr)+ret;
	}
	#undef lc
	#undef rc
	#undef mid
}
int main(){
	n=read();
	for(ri i=2;i<=n;++i)lim[i]=mn[i]=read();
	for(ri i=n-1;i;--i)mn[i]=min(mn[i+1],mn[i]);
	for(ri i=2;i<=n;++i)rt[i]=rt[mn[i]],SGT::update(rt[i],1,n,1,i-1);
	for(ri tt=read(),ans,len,g,l,r,x;tt;--tt){
		l=read(),r=read(),x=read();
		ans=len=r-l+1;
		if(l<lim[x])ans+=SGT::query(rt[lim[x]],1,n,l,min(lim[x]-1,r));
		g=gcd(ans,len);
		cout<<ans/g<<'/'<<len/g<<'\n';
	}
	return 0;
}

2019.03.09 bzoj5371: [Pkusc2018]星际穿越(主席树)的更多相关文章

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

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

  2. 2019.03.09 codeforces833B. The Bakery(线段树优化dp)

    传送门 线段树优化dpdpdp入门题. 要求把nnn个数分成kkk段,每段价值为里面不相同的数的个数,求所有段的价值之和最大值.n≤35000,k≤50n\le35000,k\le50n≤35000, ...

  3. [PKUSC2018]星际穿越

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

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

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

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

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

  6. LOJ6435 PKUSC2018 星际穿越

    这个题吧当时在考场只得了45分 然后70分的性质都分析到了 不知道为啥就是写萎蛋了 哎 当时还是too young too simple 看了一下julao们的博客这个题有两种做法 一个是比较费脑子的 ...

  7. 【模拟8.03】数颜色(vector//主席树)

    才知道vector在插入值后是可以直接修改的... 那就很简单了 用vector的lowerbound这样的二分操作,提前储存每个颜色的位置 发现交换相对位置不变 关于vector的lowerboun ...

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

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

  9. 2019.03.09 bzoj4999: This Problem Is Too Simple!(树链剖分+线段树动态开点)

    传送门 题意:给一颗树,每个节点有个初始值,要求支持将i节点的值改为x或询问i节点到j节点的路径上有多少个值为x的节点. 思路: 考虑对每种颜色动态开点,然后用树剖+线段树维护就完了. 代码: #in ...

随机推荐

  1. CSS 文字太多用省略号表示

    width:150px;/*要显示文字的宽度*/ overflow:hidden; /*超出的部分隐藏起来.*/ white-space:nowrap;/*不显示的地方用省略号...代替*/ text ...

  2. python day04笔记总结

    2019.4.1 S21 day04笔记总结 昨日内容补充 1.解释器/编译器 1.解释型语言.编译型语言 2.解释型:写完代码后提交给解释器,解释器将代码一行行执行.(边接收边解释/实时解释) 常用 ...

  3. [转]真正的中国天气api接口xml,json

    转自:http://blog.csdn.net/fancylovejava/article/details/26102635 我只想说现在网上那几个api完全坑爹有木有??? 官方的申请不来有木有,还 ...

  4. 【CPU微架构设计】利用Verilog设计基于饱和计数器和BTB的分支预测器

    在基于流水线(pipeline)的微处理器中,分支预测单元(Branch Predictor Unit)是一个重要的功能部件,它负责收集和分析分支/跳转指令的执行结果,当处理后续分支/跳转指令时,BP ...

  5. 初步了解Spring

    1.了解“控制反转” 控制反转也称为依赖注入,是面向对象编程中的一种设计理念,用来降低程序代码之间的耦合度. 下面是一个最简单的打印机实例 纸张接口,纸张有大小 继承它的有两个类,两种纸张大小的类 A ...

  6. python 的xlrd模块

    一.安装 ♦ python官网下载http://pypi.python.org/pypi/xlrd模块安装. ♦或者在cmd窗口  pip install  xlrd 二.使用 1.导入模块: imp ...

  7. JS——按钮点击事件累加注册问题

    最近在工作上遇到一个点击事件累加的问题,为元素添加点击事件效果,但是总是效果失败,最后发现点击事件被执行了多次,上网查了一下,下边就是解决这个问题的几种思路 案列引自 踮起脚尖眺望6 $(" ...

  8. 小程序解析html(使用wxParse)

    正好遇到一个数据里面是html格式的数据,小程序不支持,网上找到这个做下记录,下面是我下好的wxParse文件目录 我的文件夹放的和pages同级 1.首先引入样式@import "/wxP ...

  9. linux 网络管理的三种方式

    修改网络IP的三种方式 1.修改配置文件 1.1dhcp自动获取 配置文件地址/etc/sysconfig/network-scripts TYPE=Ethernet  #类型=以太网 PROXY_M ...

  10. Visual Studio Code 如何将新项目发布到GIT服务器

    1.在VSCode中新建或打开未添加源码管理的文件夹 2.按Ctrl+Shift+G切换到"源控件"视图,点击右上方的[初始化储存库]按钮 3.输入消息内容,然后点击右上方的[提交 ...