首页 > 其他分享 >鉄道旅行 (Railway Trip)

鉄道旅行 (Railway Trip)

时间:2024-08-22 16:06:58浏览次数:9  
标签:pre 旅行 val nxt int -- Railway Trip define

逆天贪心

设对于一个点 \(x\) 花费 \(d\) 步能走到的最左边为 \(L_{x,d}\),最右边为 \(R_{x,d}\)。

主要证明一个东西:若 \((a,b)\) 这个询问中区间 \([L_{a,x},R_{a,x}]\) 与 \([L_{b,y},R_{b,y}]\) 有交,那么必然存在一条步数为 \(x+y\) 的路径。

证明:

分类讨论

  • 当 \(val_{R_{a,x}} < val_{L_{b,y}}\),此时显然可以到 \(L_{b,y}\)。

  • 当 \(val_{R_{a,x}} > val_{L_{b,y}}\),此时显然可以到 \(R_{a,x}\),并且一定能在 \(y\) 步之内到 \(b\)。

\(Q.E.D\)

然后倍增即可,至于为何可以像代码中写的那样将两个端点分开考虑,仔细思考一下就容易发现这样得到的路径必定不劣。

点击查看代码
#include<bits/stdc++.h>
#define fir first
#define sec second
#define int long long
#define mkp(a,b) make_pair(a,b)
using namespace std;
typedef pair<int,int> pir; 
inline int read(){
	int x=0,f=1; char c=getchar();
	while(!isdigit(c)){if(c=='-') f=-1; c=getchar();}
	while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48); c=getchar();}
	return x*f;
}
const int mod=998244353,inf=1e18,N=1e5+5;
int n,k,q;
int a[N];
int l[N][20],r[N][20],st[N],top;
signed main(){
	n=read(),k=read(),q=read();
	for(int i=1;i<=n;i++) a[i]=read();
	top=0;
	for(int i=1;i<=n;i++){
		while(top&&a[st[top]]<a[i]) top--;
		if(top) l[i][0]=st[top];
		else l[i][0]=i;
		st[++top]=i;
	}
	top=0;
	for(int i=n;i>=1;i--){
		while(top&&a[st[top]]<a[i]) top--;
		if(top) r[i][0]=st[top];
		else r[i][0]=i;
		st[++top]=i;
	}
	for(int j=1;j<=19;j++) for(int i=1;i<=n;i++) 
	l[i][j]=min(l[l[i][j-1]][j-1],l[r[i][j-1]][j-1]),
	r[i][j]=max(r[r[i][j-1]][j-1],r[l[i][j-1]][j-1]);
	while(q--){
		int L=read(),R=read();
		if(L>R) swap(L,R);
		int ans=0;
		int x,y;
		x=y=L;
		for(int i=19;i>=0;i--){
			int pre=min(l[x][i],l[y][i]),nxt=max(r[x][i],r[y][i]);
			if(nxt<R){
				x=pre,y=nxt;
				ans+=(1<<i);
			}
		}
		L=y;
		x=y=R;
		for(int i=19;i>=0;i--){
			int pre=min(l[x][i],l[y][i]),nxt=max(r[x][i],r[y][i]);
			if(pre>L){
				x=pre,y=nxt;
				ans+=(1<<i);
			}
		}
		cout<<ans<<'\n';
	}
}

标签:pre,旅行,val,nxt,int,--,Railway,Trip,define
From: https://www.cnblogs.com/Cyan0826/p/18374082

相关文章

  • 微带贴片天线(microstrip patch antenna)
    基本结构:微带贴片天线是由介质基片、辐射贴片和接地板构成。设计参数主要包括贴片的材料,尺寸,工作频率。(1)贴片尺寸:微带贴片天线的尺寸影响其性能,如增益、频率等。(2)材料:介电常数表示了电介质电容器电容与真空电容器电容的比率,它在宏观上表示出这种绝缘材料储存电能能力的大小......
  • 206 旅行商问题
    //206旅行商问题.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。///*http://oj.daimayuan.top/course/14/problem/645蜗蜗的世界里有n个城市,城市两两之间通过高速公路连接,从第i个城市走到第j个城市需要花费ai,j的时间。现在蜗蜗想从1号城市出发旅......
  • strip 删除的是字符而不是 字符串
    s='abcaabc's=s.rstrip('abc') #!/usr/bin/python#-*-coding:UTF-8-*-random_string='thisisgood'#字符串末尾的空格会被删除print(random_string.rstrip())#'sioo'不是尾随字符,因此不会删除任何内容print(random_string.rstrip('......
  • 洛谷 P1560 [USACO5.2]蜗牛的旅行Snail Trails(c++)
    describe蜗牛在制定今天的旅游计划,有n个景点可选,它已经把这些景点按照顺路游览的顺序排成一排了,每个地方有相应的景观,这里用一个整数表示。蜗牛希望选取连续的一段景点,还要选出来的每一个景点的景观都不同,问它最多能选出多少个景点进行旅游。#include<iostream>#inc......
  • 基于模拟退火算法求解旅行商(TSP)问题(附word文档)
    基于模拟退火算法求解旅行商(TSP)问题(附word文档)......
  • Crash 的旅行计划 / 蓝色彼岸花 题解
    前言题目链接:Hydro&bzoj。题意简述一棵\(n\)个结点的树上,每个点有点权,有\(m\)次操作:修改\(u\)的点权;查询以\(u\)为一端的简单路径的点权和最大值。对于\(20\%\)的数据:\(n,m\leq10^3\);对于另\(30\%\)的数据:第\(i\)条边连接\(i\)和\(i+1\);对于......
  • P1522 [USACO2.4] 牛的旅行 Cow Tours
    思路对于每个连通块求出任意两点距离的最大值\(max[u]\),然后再\(O(n^2)\)枚举任意两个连通块连接起来,答案就是两个连通块的最大值\(max\)加上中间连接的边的长度。代码#include<bits/stdc++.h>usingnamespacestd;usingPDD=pair<double,double>;constintN=......
  • 基于改进遗传算法的卡车和两架无人机旅行推销员问题(D2TSP)(Matlab代码实现)
     ......
  • 蒙特卡洛模拟(6)————旅行商问题
    旅行商问题(TravelingSalesmanProblem,TSP)是一个经典的组合优化问题。经典的TSP可以描述为:一个商品推销员要去若干个城市推销商品,该推销员从一个城市出发,需要经过所有城市后,回到出发地。应如何选择行进路线,以使总的行程最短。目录一、问题提出二、代码预备1.plot([a,b],[c,d])2.r......
  • 由于分页,无法使用 python al beautifulsoup 在 tripadvisor 中获取所有结果
    我正在尝试获取餐厅的链接,但我只能获取前30家餐厅的链接,而无法获取所有其他餐厅的链接。马德里地区的餐馆有数百家,分页每页只显示30家,以下代码只获取这30家importreimportrequestsfromopenpyxlimportWorkbookfrombs4importBeautifulSoupasbcity_name='......