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 |
贴代码,注意多组测试数据,一定要把DONE读完#include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; #define N 10010 #define M 30100 #define INF 0x3f3f3f3f struct arr{ int ff,tt,ww,next; }c[M]; int X[N],Y[N],Z[N]; struct SEGMENTTREE{ int l,r,dat; }t[N << 2]; int n,T; int r[N]; int root = 0; int tot = 0; int fa[N],d[N],top[N],p[N],size[N],son[N]; inline void add(int x,int y){ c[++tot].ff = x; c[tot].tt = y; c[tot].next = r[x]; r[x] = tot; return; } void build(int p, int l, int r){ t[p].l = l,t[p].r = r; if (l == r){ t[p].dat = 0; return; } int mid = (l + r) >> 1; build(p << 1,l,mid); build((p << 1) + 1,mid + 1,r); return; } void dfs(int x){ for (int i = r[x]; i; i = c[i].next){ int y = c[i].tt; if (!d[y]){ d[y] = d[x] + 1; fa[y] = x; dfs(y); size[y]++; size[x] += size[y]; if (size[son[x]] < size[y]) son[x] = y; } } return; } int s = 0; void dfs1(int x,int y){ p[x] = ++ s; top[x] = y; if (son[x]) dfs1(son[x],y); else return; for (int i = r[x]; i; i = c[i].next){ int y = c[i].tt; if (d[y] == d[x] + 1 && y != son[x]){ dfs1(y,y); } } return; } void change(int p,int x,int y){ if (t[p].l == t[p].r){ t[p].dat = y; return; } int mid = (t[p].l + t[p].r) >> 1; if (x <= mid) change(p << 1,x,y); else change((p << 1) + 1,x,y); t[p].dat = max(t[p << 1].dat,t[(p << 1) + 1].dat); return; } int ask_max(int p,int l,int r){ if (t[p].l >= l && t[p].r <= r){ return t[p].dat; } int mid = (t[p].l + t[p].r) >> 1; int ans = -INF; if (l <= mid) ans = max(ans,ask_max(p << 1,l,r)); if (r > mid) ans = max(ans,ask_max((p << 1) + 1,l,r)); return ans; } int ask(int x,int y){ int fx = top[x],fy = top[y]; int ans = -INF; while (fx != fy){ if (d[fx] < d[fy]){ swap(fx,fy); swap(x,y); } ans = max(ans,ask_max(1,p[fx],p[x])); x = fa[fx]; fx = top[x]; } if (x == y) return ans; if (d[x] > d[y]) swap(x,y); ans = max(ans,ask_max(1,p[son[x]],p[y])); return ans; } void change2(int p,int l,int r){ if (t[p].l == t[p].r){ t[p].dat *= -1; return; } int mid = (t[p].l + t[p].r) >> 1; if (l <= mid) change2(p << 1,l,r); if (r > mid) change2((p << 1) + 1,l,r); t[p].dat = max(t[p << 1].dat,t[(p << 1) + 1].dat); return; } void NEG(int x,int y){ int fx = top[x],fy = top[y]; while (fx != fy){ if (d[fx] < d[fy]){ swap(fx,fy); swap(x,y); } change2(1,p[fx],p[x]); x = fa[fx]; fx = top[x]; } if (x == y) return; if (d[x] > d[y]) swap(x,y); change2(1,p[son[x]],p[y]); return; } void clean(){ memset(son,0,sizeof(son)); memset(fa,0,sizeof(fa)); memset(d,0,sizeof(d)); memset(X,0,sizeof(X)); memset(Y,0,sizeof(Y)); memset(Z,0,sizeof(Z)); memset(p,0,sizeof(p)); memset(c,0,sizeof(c)); memset(r,0,sizeof(r)); memset(t,0,sizeof(t)); tot = 0;s = 0; memset(size,0,sizeof(size)); memset(top,0,sizeof(top)); } int main(){ scanf("%d",&T); while (T--){ clean(); char cc; while (1){ cc = getchar(); if (cc == '\r' || cc == '\n') break; } scanf("%d",&n); for (int i = 1; i < n; i++){ scanf("%d%d%d",&X[i],&Y[i],&Z[i]); add(X[i],Y[i]); add(Y[i],X[i]); } root = rand() % n + 1; size[root] = 1;d[root] = 1; dfs(root); dfs1(root,root); build(1,1,s); for (int i = 1; i < n; i++){ if (d[X[i]] > d[Y[i]]) swap(X[i],Y[i]); change(1,p[Y[i]],Z[i]); } char ch; int x,y; while (1){ while (1){ ch = getchar(); if (ch == 'Q' || ch == 'C' || ch == 'N' || ch == 'D') break; } if (ch == 'D') break; switch (ch){ case 'Q':{ while (ch != ' ') ch = getchar(); scanf("%d%d",&x,&y); printf("%d\n",ask(x,y)); break; } case 'C':{ while (ch != ' ') ch = getchar(); scanf("%d%d",&x,&y); change(1,p[Y[x]],y); break; } case 'N':{ while (ch != ' ') ch = getchar(); scanf("%d%d",&x,&y); NEG(x,y); break; } } } } } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator