[USACO14DEC] Marathon G

news/2024/11/17 12:50:10/

洛谷[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)

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;
}

http://www.ppmy.cn/news/977630.html

相关文章

spring boot统一返回

springboot 写controller层代码&#xff0c;尽量减少重复代码,用ResponseBodyAdvice实现统一返回&#xff1a; 1. ResponseAdvice package com.zdxf.common;import com.zdxf.common.pojo.ResultVO; import com.zdxf.common.utils.RestResponse; import org.springframework.c…

《TCP IP网路编程》第九章

第 9 章 套接字的多种可选项 我们进行套接字编程时往往只关注数据通信&#xff0c;而忽略了套接字具有的不同特性。但是&#xff0c;理解这些特性并根据实际需要进行更改也很重要。下面列出了一些套接字可选项。 从表中可以看出&#xff0c;套接字可选项是分层的。 IPPROTO_IP …

hqyj—驱动—day3

ioctl控制马达&#xff0c;LED灯&#xff0c;风扇&#xff0c;蜂鸣器运行 LED LED驱动程序&#xff1a; #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/io.h> #include "stm32mp1xx_gpio.h"…

Elasticsearch 简单搜索查询案例

1.MySql表结构/数据 SET FOREIGN_KEY_CHECKS0;-- ---------------------------- -- Table structure for user_lables -- ---------------------------- DROP TABLE IF EXISTS user_lables; CREATE TABLE user_lables (id varchar(255) DEFAULT NULL COMMENT 用户唯一标识,age…

Linux系列---【Ubuntu 20.04安装KVM】

Ubuntu 20.04安装KVM 一、安装kvm 1.安装kvm sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils 2. 将当前用户添加至libvirt 、 kvm组 sudo adduser $USER libvirt sudo adduser $USER kvm 3.验证安装 virsh list --all 4.启动libvert sudo syst…

使用数据解析方法以及快手商品详情API

一、要调用快手商品详情API&#xff0c;您需要完成以下步骤&#xff1a; 登录到您的快手开放平台开发者账户。 在开发者控制台中创建一个新的应用程序。 在创建应用程序之后&#xff0c;您将可以在开发者文档中找到所有可用的API文档。 在API文档中&#xff0c;您将找到商品…

ARM 循环阻塞延迟函数

串行驱动的关键是双方能够按照既定的时序进行检测、设置相关引脚上的电平&#xff0c;比如单总线、I2c这样基本的可以用GPIO模拟的时序协议&#xff0c;需要主从双方&#xff0c;必须在链路接口内严格按照微妙级的延迟单位进行时序同步。 所以&#xff0c;在这种对时间要求很敏…

使用Echarts图表时,页面切换后并且改变页面窗口大小,再切回原来页面Echarts图表显示有问题

Echarts正常显示&#xff1a; 页面切换并改变了也买你窗口大小&#xff0c;再回到原来页面&#xff1a; methods: {handlerResize(){this.myChart.resize()} }, mounted(){window.addEventListener(resize, this.handlerResize); }, destroyed() {window.removeEventListener(r…