[USACO14DEC] Marathon G

这篇具有很好参考价值的文章主要介绍了[USACO14DEC] Marathon G。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

洛谷[USACO14DEC] Marathon G

题目大意

Bessie \text{Bessie} Bessie设计了一条马拉松路线,有 N N N个点。

Bessie \text{Bessie} Bessie q q q次操作,每次操作是修改或询问。每次修改会修改一个点的坐标,每次询问是选手跑过一条子路径的时间,一条子路线是整条路线中包含若干连续点的一段。一个单位的时间可以跑一个单位的距离,选手可以省略一个点不跑,但这个点不能是这条子路径的起点或终点。

相邻两个点 ( x 1 , y 1 ) (x_1,y_1) (x1,y1) ( x 2 , y 2 ) (x_2,y_2) (x2,y2)的距离为 ∣ x 1 − x 2 ∣ + ∣ y 1 − y 2 ∣ |x_1-x_2|+|y_1-y_2| x1x2+y1y2

1 ≤ n ≤ 1 0 5 , 1 ≤ q ≤ 1 0 5 1\leq n\leq 10^5,1\leq q\leq 10^5 1n105,1q105


题解

用线段树维护子路径的长度和这条子路径上删除一个点能够减少的最大距离。

那么,修改就修改线段树上对应位置的值,查询就求这一段子路径的距离和子路径上删除一个点能够减少的最大距离,两者相减即可得到答案。

时间复杂度为 O ( ( n + q ) log ⁡ n ) O((n+q)\log n) O((n+q)logn)文章来源地址https://www.toymoban.com/news/detail-606229.html

code

#include<bits/stdc++.h>
#define lc k<<1
#define rc k<<1|1
using namespace std;
int n,q,ans,mx,a[100005],b[100005],tr[500005],sum[500005];
int dis(int i,int j){
	return abs(a[i]-a[j])+abs(b[i]-b[j]);
}
void build(int k,int l,int r){
	if(l==r){
		if(l==1||l==n) tr[k]=0;
		else tr[k]=dis(l-1,l)+dis(l,l+1)-dis(l-1,l+1);
		sum[k]=dis(l,l+1);
		return;
	}
	int mid=l+r>>1;
	build(lc,l,mid);
	build(rc,mid+1,r);
	tr[k]=max(tr[lc],tr[rc]);
	sum[k]=sum[lc]+sum[rc];
}
void ch(int k,int l,int r,int x){
	if(l==r&&l==x){
		if(l==1||l==n) tr[k]=0;
		else tr[k]=dis(l-1,l)+dis(l,l+1)-dis(l-1,l+1);
		sum[k]=dis(l,l+1);
		return;
	}
	int mid=l+r>>1;
	if(x<=mid) ch(lc,l,mid,x);
	else ch(rc,mid+1,r,x);
	tr[k]=max(tr[lc],tr[rc]);
	sum[k]=sum[lc]+sum[rc];
}
void find(int k,int l,int r,int x,int y){
	if(l>=x&&r<=y){
		ans+=sum[k];
		mx=max(mx,tr[k]);
		return;
	}
	int mid=l+r>>1;
	if(x<=mid) find(lc,l,mid,x,y);
	if(y>mid) find(rc,mid+1,r,x,y);
}
int main()
{
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n;i++){
		scanf("%d%d",&a[i],&b[i]);
	}
	build(1,1,n);
	int v,x,y;
	char c;
	while(q--){
		c=getchar();
		while(c!='U'&&c!='Q') c=getchar();
		if(c=='U'){
			scanf("%d%d%d",&v,&x,&y);
			a[v]=x;b[v]=y;
			ch(1,1,n,v);
			if(v-1>=1) ch(1,1,n,v-1);
			if(v+1<=n) ch(1,1,n,v+1);
		}
		else{
			scanf("%d%d",&x,&y);
			ans=0;mx=0;
			find(1,1,n,x+1,y-1);
			ans=ans+dis(x,x+1)-mx;
			printf("%d\n",ans);
		}
	}
	return 0;
}

到了这里,关于[USACO14DEC] Marathon G的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [USACO07DEC] Sightseeing Cows G(分数规划+负权回路判定)

    [USACO07DEC] Sightseeing Cows G - 洛谷 题目大意: 给出一张n点m边的带点权带边权的有向图 求一个回路使得路上点权和除以边权和最大(最优比率回路) 首先一定仔细读题,是回路不是路径 由于回路上所有点权只能获取一次,但边权会获取很多次,所以最优解一定是简单回路(无

    2024年02月10日
    浏览(250)
  • P2921 [USACO08DEC] Trick or Treat on the Farm G

    Portal. 每只奶牛的终止条件是到达自己已经访问过的点,换言之,就是该奶牛的路线构成了一个环。并且,每一个房间通往的房间都是固定且唯一的,所以说只要进入的这个房间在环上,这个房间之后会获得的糖果数已经固定了。 我们开一个数组 s 记录当前位置的糖果数量,

    2024年02月06日
    浏览(237)
  • [USACO23JAN] Lights Off G题解

    洛谷[USACO23JAN] Lights Off G 题目大意 贝西想要睡觉,但是农场的灯一直开着,影响它睡觉。 贝西有两个长度为 n n n 的 01 01 01 字符串,分别表示 n n n 盏灯的序列和开关的序列。其中,表示灯的序列, 0 0 0 表示关灯, 1 1 1 表示开灯;表示开关的序列, 1 1 1 表示可操控的, 0 0

    2024年02月13日
    浏览(34)
  • P2730 [USACO3.2] 魔板 Magic Squares 题解

    夜深人静的夜晚,我开了这道题。看起来,完成它是一件轻而易举的事。我想了想,打开Dev-C++,开始写代码。 然而,那时的我还不知道,我踏入了深渊...... 咳咳,中二病犯了,前面的文字请忽略。 题目要求最少操作次数,显然,我们要使用BFS来求解。 对于每个节点,接下

    2024年02月13日
    浏览(34)
  • 【题解】JZOJ6578 / 洛谷P5201[USACO2019Jan]Shortcut G

    洛谷 P5201 [USACO19JAN] Shortcut G 在一个带权无向连通图上,每个点有 a i a_i a i ​ 只奶牛,奶牛会走最短路径到 1 1 1 ,如果有多条路径,选择字典序最小的,定义移动总时间为所有奶牛走到 1 1 1 的时间之和。你可以修建一条从任意一点到 1 1 1 的边权为 t t t 的边,奶牛只有在平时

    2024年02月11日
    浏览(31)
  • [USACO11MAR] Brownie Slicing G题解(二分+二维前缀和+矩阵分割)

    题目地址 P3017 [USACO11MAR] Brownie Slicing G 二分最大化最小值 切割思路: 一行一行进行切割,如果这一行可以切割出b块大于等于mid的块,就开始切割下一行 如果无法切割出b块,就把正在切割的行与下一行拼起来一起切割 最后通过能切割出b块的水平块块够不够a条来判断m是否合

    2024年02月07日
    浏览(39)
  • 第14届蓝桥杯C++A组题解

    不会写 枚举第i行 二进制枚举状态 然后check(i)是否合法,如果合法就dfs(i+1) check是核心 判断第上一行是否==A[i][j] 判断第i行是否小于等于A且,c+3=A 判断下一行是否小于等于A且,c+6=A 按位做就好了 比如 5 1 2 3 4 5 bit=0 数组变成 10101 bit=1 数组变成 01100 单独考虑bit=0,模2意义

    2023年04月09日
    浏览(31)
  • 【LGR-145-Div.4】洛谷入门赛 #14(ABCDEI题解)

    离开CSDN近五分之一坤年后,我又回归了,这段时间没刷题(忙中考去了),于是乎参加了【LGR-145-Div.4】洛谷入门赛 #14,那才叫。。。(这就是为什么没有FGH题解的原因) 水题,直接上AC代码: 我的思路是,先把S0-i排一下序,然后再遍历S0-i,如果S[i]不等于S[i+1],就代表又有

    2024年02月16日
    浏览(41)
  • 2023第14届蓝桥杯C/C++A组省赛题解

    挂个 dotcpp 的 oj ,蓝桥杯的题都能来这里交 2023年第十四届蓝桥杯大赛软件类省赛C/C++大学A组真题 (dotcpp.com) 目录 试题 A: 幸运数(枚举) 思路: 代码: 试题 B: 有奖问答(搜索 / 线性dp) 试题 C: 平方差(数学 / 结论) 思路: 代码: 试题 D: 更小的数(区间dp) 思路: 代码:

    2023年04月26日
    浏览(30)
  • 第14届蓝桥杯C++B组省赛题解(A-J)(更新完毕)

    目录 A. 日期统计 题目内容 思路 代码 答案 B.01 串的熵 题目内容 思路 代码 答案 C.冶炼金属 题目内容 输入格式 输出格式 输入样例 输出样例 思路 代码 D.飞机降落 题目内容 输入格式 输出格式 输入样例 输出样例 思路 代码 E.接龙数列 题目内容 输入格式 输出格式 输入样例

    2023年04月25日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包