比赛 20150422 评测结果 AAAEEEEEEE
题目名称 马拉松 最终得分 30
用户昵称 ggwdwsbs 运行时间 0.679 s
代码语言 C++ 内存使用 1.01 MiB
提交时间 2015-04-22 11:49:05
显示代码纯文本
#include<stdio.h>
#include<cstring>
const int maxn=10001;
struct tree
{
	int left,right;
	long long sum;
}a[maxn*4];
int b[maxn];
int build(int k,int l,int r)
{
	a[k].left=l;
	a[k].right=r;
	if(l==r) a[k].sum=b[l];
	else
	{
		build(2*k,l,(l+r)/2);
		build(2*k+1,(l+r)/2+1,r);
		a[k].sum=a[2*k].sum+a[2*k+1].sum;
	}
}
int insert(int k,int x,int num)
{
	if(a[k].left==a[k].right)
	{
		a[k].sum=num;
	}
	else
	{
		if(x<=(a[k].left+a[k].right)/2) insert(2*k,x,num);
		if(x>(a[k].left+a[k].right)/2) insert(2*k+1,x,num);
		a[k].sum=a[2*k].sum+a[2*k+1].sum;
	}
}
long long query(int k,int l,int r)
{
	if(l>a[k].right||r<a[k].left) return 0;
	if(l<=a[k].left&&a[k].right<=r) return a[k].sum;
	else return query(2*k,l,r)+query(2*k+1,l,r);
}

int x[maxn];
int y[maxn];
int n,q,l,r,x1,y1,j;
char c;
int abs(int x)
{
	if(x>0) return x;
	else return -x;
}
int dis(int i,int j)
{
	return abs(x[i]-x[j]) + abs(y[i]-y[j]);
}
int main()
{
	freopen("marathona.in","r",stdin);
	freopen("marathona.out","w",stdout);
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d",&x[i],&y[i]);
		b[i]=dis(i,i-1);
	}
	b[1]=0;
	build(1,1,n);
	for(int i=1;i<=q;i++)
	{
		c=getchar();
		while(c!='Q'&&c!='U') 
		 c=getchar();
		if(c=='Q')
		{
			scanf("%d%d",&l,&r);
			long long ans=query(1,l+1,r);
			long long ret=2147483600;
			for(int j=l+1;j<=r-1;j++)
			 if(ret>ans-b[j]-b[j+1]+dis(j-1,j+1))
			 {
			 	ret=ans-b[j]-b[j+1]+dis(j-1,j+1);
			 }
			printf("%lld\n",ret); 
		}
		if(c=='U')
		{
			scanf("%d%d%d",&j,&x1,&y1);
			x[j]=x1;
			y[j]=y1;
			b[j]=dis(j,j-1);
			b[j+1]=dis(j+1,j);
			insert(1,j,b[j]);
			insert(1,j+1,b[j+1]);
		}
	}
}