记录编号 335845 评测结果 AAAAAAAAAA
题目名称 马拉松 最终得分 100
用户昵称 GravatarLOSER 是否通过 通过
代码语言 C++ 运行时间 2.678 s
提交时间 2016-11-02 19:30:46 内存使用 7.18 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 100010
int n,m;
struct Point{int x,y;}a[maxn];
int Getdis(int x,int y){return abs(a[x].x-a[y].x)+abs(a[x].y-a[y].y);}
struct Segment_tree{
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define mid ((l+r)>>1)
	int Max[maxn<<2],sum[maxn<<2];
	void Modify(int rt,int l,int r) {Max[rt]=max(Max[rt<<1],Max[rt<<1|1]);sum[rt]=sum[rt<<1]+sum[rt<<1|1];}
	void Build(int rt,int l,int r){
		if(l==r) {
			Max[rt]=Getdis(l-1,l)+Getdis(l,l+1)-Getdis(l-1,l+1);
			sum[rt]=Getdis(l-1,l);
			return;
		}	Build(lson); Build(rson);
		Modify(rt,l,r);
	}	
	int Querymax(int s,int t,int rt,int l,int r){
		if(s>t) return 0;
		if(s<=l && t>=r) return Max[rt];
		if(t<=mid) return Querymax(s,t,lson);
		if(s>mid) return Querymax(s,t,rson);
		return max(Querymax(s,t,lson),Querymax(s,t,rson));
	}
	int Querysum(int s,int t,int rt,int l,int r){
		if(s>t) return 0;
		if(s<=l && t>=r) return sum[rt];
		if(t<=mid) return Querysum(s,t,lson);
		if(s>mid) return Querysum(s,t,rson);
		return Querysum(s,t,lson)+Querysum(s,t,rson);	
	}
	void Insert(int x,int rt,int l,int r) {
		if(l==r) {
			Max[rt]=Getdis(l-1,l)+Getdis(l,l+1)-Getdis(l-1,l+1);
			sum[rt]=Getdis(l-1,l);
			return;	
		}	
		if(x<=mid) Insert(x,lson); 
		else Insert(x,rson); 
		Modify(rt,l,r);
	}
}T1,T2;
int main(){
	freopen("marathona.in","r",stdin); freopen("marathona.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;i++) scanf("%d%d",&a[i].x,&a[i].y);
	//为了让下标容易处理,所以从0开始 
	n-=2; T1.Build(1,1,n);  T2.Build(1,1,n+1);
	while( m-- ) {
	//	printf("--------DONE-------\n");
		char ch; scanf(" %c",&ch);
		if(ch=='U') {
			int pos,x,y; scanf("%d%d%d",&pos,&x,&y); pos--;
			a[pos].x=x,a[pos].y=y; 
			if(pos!=0 && pos!=n+1)T1.Insert(pos,1,1,n);			
			if(pos+1!=0 && pos!=n)T1.Insert(pos+1,1,1,n);
			if(pos-1!=0 && pos-1!=n+1)T1.Insert(pos-1,1,1,n);
			//维护线段树 
			if(pos!=0){
				T2.Insert(pos,1,1,n+1);
				T2.Insert(pos+1,1,1,n+1);
			}
			if(pos==0)T2.Insert(pos+1,1,1,n+1);
			//printf("%d\n",T2.Getsum(1));
			/*for(int i=1;i<=n+1;i++) {
				printf("<%d>\n",T2.Getsum(i));	
			}*/
		}		
		if(ch=='Q') {
			int s,t,temp; scanf("%d%d",&s,&t); t--,s--;
			//因为Getsum(0)会死循环 
			temp=T2.Querysum(s+1,t,1,1,n+1)-T1.Querymax(s+1,t-1,1,1,n);	
			printf("%d\n",temp);
		}
	}
	getchar(); getchar();
	return 0;
}
/*
5 10
2 5
1 3
1 1
3 5
2 2
U 2 3 2
Q 2 4
*/