首页 > 其他分享 >题解:P3113 [USACO14DEC] Marathon G

题解:P3113 [USACO14DEC] Marathon G

时间:2024-09-16 12:12:42浏览次数:8  
标签:ix mat int 题解 second qb maxn P3113 Marathon

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

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

代码:

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
const int maxn=145141;
int n,q;
pii mat[maxn];
int delta[2*maxn];
int dist[2*maxn];
int qa,qb;
int getd(int a,int b){
	return abs(mat[a].first-mat[b].first)+abs(mat[a].second-mat[b].second);
}
void build(int rt,int a,int b){
	if(a>b)return;
	if(a==b){
		if(a<n-1)delta[rt]=getd(a,a+1)+getd(a+1,a+2)-getd(a,a+2);
		else delta[rt]=0;
		if(a<n)dist[rt]=getd(a,a+1);
		else dist[rt]=0;
		return;
	}
	int mid=(a+b)/2;
	build(rt*2,a,mid);
	build(rt*2+1,mid+1,b);
	delta[rt]=max(delta[rt*2],delta[rt*2+1]);
	dist[rt]=dist[rt*2]+dist[rt*2+1];
}
int query_dist(int rt,int a,int b){
	if(a>qb||b<qa)return 0;
	if(qa<=a&&b<=qb)return dist[rt];
	int mid=(a+b)/2;
	return query_dist(rt*2,a,mid)+query_dist(rt*2+1,mid+1,b);
}

int query_delta(int rt,int a,int b){
	if(a>qb||b<qa)return 0;
	if(qa<=a&&b<=qb)return delta[rt];
	int mid=(a+b)/2;
	return max(query_delta(rt*2,a,mid),query_delta(rt*2+1,mid+1,b));
}

void update_dist(int rt,int a,int b){
	if(a>qb||b<qa)return;
	if(qa<=a&&b<=qb){
		if(a>=1&&a<n)dist[rt]=getd(a,a+1);
		else dist[rt]=0;
		return;
	}
	int mid=(a+b)/2;
	update_dist(rt*2,a,mid);
	update_dist(rt*2+1,mid+1,b);
	dist[rt]=dist[rt*2]+dist[rt*2+1];
}
void update_delta(int rt,int a,int b){
	if(a>qb||b<qa)return;
	if(qa<=a&&b<=qb){
		if(a>=1&&a<n-1)delta[rt]=getd(a,a+1)+getd(a+1,a+2)-getd(a,a+2);
		else delta[rt]=0;
		return;
	}
	int mid=(a+b)/2;
	update_delta(rt*2,a,mid);
	update_delta(rt*2+1,mid+1,b);
	delta[rt]=max(delta[rt*2],delta[rt*2+1]);
}

int main(){
	cin>>n>>q;
	for(int i=1;i<=n;i++){
		cin>>mat[i].first>>mat[i].second;
	}
	build(1,1,n);
	for(int i=0;i<q;i++){
		char c;
		cin>>c;
		if(c=='Q'){
			cin>>qa>>qb;
			qb--;
			int tot=query_dist(1,1,n);
			qb--;
			int del=query_delta(1,1,n);
			cout<<tot-del<<'\n'; 
		}else{
			int ix,pa,pb;
			cin>>ix>>pa>>pb; 
			mat[ix].first=pa;
			mat[ix].second=pb;
			for(int j=ix-1;j<=ix;j++){
				qa=j;
				qb=j;
				update_dist(1,1,n);
			}
			for(int j=ix-2;j<=ix;j++){
				qa=j;
				qb=j;
				update_delta(1,1,n);
			}
		}
	}
}

标签:ix,mat,int,题解,second,qb,maxn,P3113,Marathon
From: https://www.cnblogs.com/cly312/p/18416167

相关文章

  • 题解:P10961 划分大理石
    设\(f_x\)表示拼成\(x\)后,当前的大理石最多还能剩下几块,不能拼成就是\(-1\)。状态转移(当前考虑的大理石价值为\(i\),有\(x\)块):\(f_j=x(f_j\ge0)\)本来就可以拼成,那么现在的大理石都可以剩下。\(f_j=f_{j-i}-1(f_j=-1,j\gei,f_{j-i}>0)\)本来不能拼成,但用了一块就能拼......
  • AGC026D Histogram Coloring 题解
    [AGC026D]HistogramColoring题解给定\(n\)列的网格,每列高为\(h_i\),将每个格子染色成红色或蓝色,使得每个\(2\times2\)的区域都恰好有两个蓝格子和两个红格子,求方案数(对\(10^9+7\)取模)。\(1\leqn\leq100,1\leqh_i\leq10^9\)性质为了方便讲述,先假设\(h_i=h_{i+......
  • P2657 [SCOI2009] windy 数 题解
    枚举、预处理,len-1位,len位但小于第一个数的这些都不讲了,看这篇题解windy讲一下贴近最高位的处理。因为最高位如果取了,后面位数只能取到最高位,而不是9,而后面的数也是同理,所以我们的内部$\j\$循环枚举范围要把\(num_i\)单独拿出来判,单独拿出来的原因是好判break一些,因为已......
  • AGC005D ~K Perm Counting 题解
    [AGC005D]~KPermCounting题解如果一个排列\(P\)满足对于所有的\(i\)都有\(|P_i-i|\neqk\),则称排列\(P\)为合法的。现给出\(n\)和\(k\),求有多少种合法的排列。由于答案很大,请输出答案对\(924844033\)取模的结果。\(2\leqn\leq2\times10^3\),\(1\leqk\leqn......
  • P2602 [ZJOI2010] 数字计数 题解
    数位dp的板子题?显然\([a,b]\)等价于\([0,b]-[0,a]\)。考虑\(dp_{i,j}\)表示到第\(i\)位数字\(j\)的答案。先不考虑数字大小限制(即1到999之类),则显然有\(dp_{i,j}=dp_{i-1,j}\times10+10^{i-1}。当前数字是0时则减去10^{i-1},再减去1。\)所以我们可以预处理出\(dp\),来表示后面......
  • 图:207课程表 题解:入度数组,邻接表,队列,拓扑排序
    207.课程表-力扣(LeetCode)没做出来,参考题解,这篇题解写的非常好。把一个有向无环图转成线性的排序就叫 拓扑排序。(没太懂这句话的意思)classSolution{public:boolcanFinish(intnumCourses,vector<vector<int>>&prerequisites){vector<int>inDegre......
  • 【题解】【动态规划】—— [NOIP2006 普及组] 开心的金明
    【题解】【动态规划】——[NOIP2006普及组]开心的金明[NOIP2006普及组]开心的金明题目描述输入格式输出格式输入输出样例输入#1输出#1提示1.题意解析2.AC代码2.1.二维d......
  • 【题解】【模拟】—— [NOIP2008 普及组] ISBN 号码
    【题解】【模拟】——[NOIP2008普及组]ISBN号码[NOIP2008普及组]ISBN号码题目描述输入格式输出格式输入输出样例输入#1输出#1输入#2输出#2提示1.思路解析2.AC代码[NOIP2008普及组]ISBN号码通往洛谷的传送门题目描述每一本正式出版的图书都有一个I......
  • 【题解】—— [NOIP2011 普及组] 数字反转
    【题解】——[NOIP2011普及组]数字反转[NOIP2011普及组]数字反转题目描述输入格式输出格式输入输出样例输入#1输出#1输入#2输出#2提示1.思路解析2.AC代码[NOIP2011普及组]数字反转通往洛谷的传送门题目描述给定一个整数......
  • 【题解】【枚举】——First Step (ファーストステップ)
    【题解】【枚举】——FirstStepファーストステップFirstStep(ファーストステップ)题目背景题目描述输入格式输出格式输入输出样例输入#1输出#1提示1.思路解析2.AC代码FirstStep(ファーストステップ)原题在洛谷上题目背景我们Aqours,要第一次举办演唱会啦......