Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
救命啊我快被这道题搞死了,谁能给我组错误数据啊 如果嫌麻烦谁能告诉我怎么随机生成一棵树啊? 如果有位活菩萨愿意帮我查一下错那就太好了!!!! Euler[]就是欧拉序列 rmq就是求Lca tree就是用线段数维护区间内各点到根的delta #include<iostream> using namespace std; const int maxn=100005; const int T=1; int n,q,s,w,d[maxn],r[maxn],b[maxn],father[maxn],p[maxn][5],Euler[maxn*T]; struct edge{int a,b,c;}; edge e[maxn],E[maxn]; int compare(const void *x,const void *y) { return ((edge*)x)->a-((edge*)y)->a; } struct RMQ { int rmq[maxn*T*2]; void build(int root,int left,int right) { int mid=(left+right)/2; if (left==right) {rmq[root]=Euler[left]; return;} build(root*2,left,mid); build(root*2+1,mid+1,right); rmq[root]=min(rmq[root*2],rmq[root*2+1]); } int query(int root,int l,int r,int i,int j) { int m=(l+r)/2; if (l==i && r==j) return rmq[root]; if (j<=m) return query(root*2,l,m,i,j); if (m<i) return query(root*2+1,m+1,r,i,j); return min(query(root*2,l,m,i,m),query(root*2+1,m+1,r,m+1,j)); } }; RMQ rmq; struct Interval_Tree { int tree[maxn*T*2]; void modify(int root,int l,int r,int i,int j) { int m=(l+r)/2; if (l==i && r==j) tree[root]+=w; else if (j<=m) modify(root*2,l,m,i,j); else if (m<i) modify(root*2+1,m+1,r,i,j); else { modify(root*2,l,m,i,m); modify(root*2+1,m+1,r,m+1,j); } } int query(int root,int l,int r,int k) { int m=(l+r)/2; if (l==r) return tree[root]; else if (k<=m) return query(root*2,l,m,k)+tree[root]; else return query(root*2+1,m+1,r,k)+tree[root]; } }; Interval_Tree tree; void dfs(int root) { int i; Euler[++Euler[0]]=root; r[root]=Euler[0]; b[root]=Euler[0]; for (i=p[root][0]; i<=p[root][1]; i++) if (e[i].b!=father[root]) { father[e[i].b]=root; d[e[i].b]=d[root]+e[i].c; dfs(e[i].b); Euler[++Euler[0]]=root; b[root]=Euler[0]; } } inline int dist(int v) {return d[v]+tree.query(1,1,Euler[0],r[v]);} int main() { freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); int i,k,flag,tmp; scanf("%d%d%d",&n,&q,&s); for (i=1; i<=n-1; i++) scanf("%d%d%d",&e[i].a,&e[i].b,&e[i].c); for (i=1; i<=n-1; i++) E[i]=e[i]; for (i=1; i<=n-1; i++) {e[i+n-1].a=e[i].b;e[i+n-1].b=e[i].a;e[i+n-1].c=e[i].c;} qsort(e,2*n-1,sizeof(edge),compare); for (i=1; i<=2*(n-1); i++) { if (e[i].a!=e[i-1].a) p[e[i].a][0]=i; if (e[i].a!=e[i+1].a) p[e[i].a][1]=i; } Euler[0]=0; d[1]=0; father[1]=0; dfs(1); rmq.build(1,1,Euler[0]); for (i=1; i<=q; i++) { scanf("%d",&flag); if (flag==0) { scanf("%d",&k); printf("%d\n",dist(s)+dist(k)-2*dist(rmq.query(1,1,Euler[0],min(r[s],r[k]),max(r[s],r[k])))); s=k; } else { scanf("%d%d",&k,&w); tmp=w; w=w-E[k].c; E[k].c=tmp; if (father[E[k].a]==E[k].b) k=E[k].a; else k=E[k].b; tree.modify(1,1,Euler[0],r[k],b[k]); } } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator