比赛 |
20150422 |
评测结果 |
AWWWWWWWWW |
题目名称 |
马拉松 |
最终得分 |
10 |
用户昵称 |
KZNS |
运行时间 |
2.159 s |
代码语言 |
C++ |
内存使用 |
7.18 MiB |
提交时间 |
2015-04-22 11:50:30 |
显示代码纯文本
#include<fstream>
using namespace std;
ifstream fi("marathona.in");
ofstream fo("marathona.out");
int abs(int a){
if(a<0)
return -a;
return a;
}
class pt{//point
public:
int x,y;
void get(){
fi>>x>>y;
}
}pu,point[100010];
int far(pt a,pt b){
return abs(a.x-b.x)+abs(a.y-b.y);
}
class tree{
public:
int l,r,lc,rc,sm,mn,lf,rf;
void clean(){
l=r=lc=rc=sm=mn=lf=rf=0;
}
}tr[200010],treenew;
tree operator+(tree a,tree b){
tree u;
u.l=a.l;
u.r=b.r;
u.lc=u.rc=0;
u.sm=a.sm+b.sm;
u.lf=a.lf;
u.rf=b.rf;
u.mn=min(min(a.mn+b.sm,a.sm+b.mn),a.sm+b.sm-a.rf-b.lf+far(point[a.r-1],point[b.l+1]));
return u;
}
int toto=1;
void mt(int l,int r){//make tree
if(l+1==r){
tree u;
u.l=l;
u.r=r;
u.lc=u.rc=0;
u.sm=u.mn=u.lf=u.rf=far(point[l],point[r]);
tr[toto]=u;
toto++;
return;
}
int md=(l+r)/2,uing=toto,lc,rc;
tree u;
toto++;
lc=toto;
mt(l,md);
rc=toto;
mt(md,r);
u=tr[lc]+tr[rc];
u.lc=lc;
u.rc=rc;
tr[uing]=u;
}
tree find(int root,int l,int r){
if(l<=tr[root].l&&tr[root].r<=r)
return tr[root];
tree u;
u.clean();
if(l<tr[tr[root].lc].r)
u=find(tr[root].lc,l,r);
if(tr[tr[root].rc].l<r)
if(!u.r)
u=find(tr[root].rc,l,r);
else
u=u+find(tr[root].rc,l,r);
return u;
}
void change(int root,int t){
if(tr[root].l==t||tr[root].r==t){
tr[root].sm=tr[root].mn=tr[root].lf=tr[root].rf=far(point[tr[root].l],point[tr[root].r]);
return;
}
if(t<=tr[tr[root].lc].r)
change(tr[root].lc,t);
if(tr[tr[root].rc].l<=t)
change(tr[root].rc,t);
int lc=tr[root].lc,rc=tr[root].rc;
tr[root]=tr[lc]+tr[rc];
tr[root].lc=lc;
tr[root].rc=rc;
}
int main(){
int n,q;
fi>>n>>q;
for(int i=1;i<=n;i++)
point[i].get();
mt(1,n);
int a,b;
char c;
for(int i=0;i<q;i++){
fi>>c;
if(c=='Q'){
fi>>a>>b;
tree u=find(1,a,b);
fo<<u.mn<<endl;
}
else{
fi>>a;
point[a].get();
change(1,a);
}
}
return 0;
}