F. Auction of Services
http://codeforces.com/gym/298615/problem/F
构建最小生成树,然后在树上建立lca,对于每次查询,相当于输出任意两点之间的最大值,用lca来处理树上任意两点的最大值。
g[i][j]表示i号点向上跳2^j次的链上的最大值
g[now][i]=max(g[now][i],g[f[now][i-1]][i-1]);
g[now][i]=max(g[now][i],g[now][i-1]);
ans=max(ans,g[x][0]);
ans=max(ans,g[y][0]);
#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <cmath> #include <cstring> #define inf 2147483647 #define N 200010 #define p(a) putchar(a) #define For(i,a,b) for(int i=a;i<=b;++i) //by war //2020.10.13 using namespace std; int T,n,m,s,x,y,a,b,k; int f[N][21],deep[N],g[N][21],d[N]; bool flag; void in(int &x){ int y=1;char c=getchar();x=0; while(c<'0'||c>'9'){if(c=='-')y=-1;c=getchar();} while(c<='9'&&c>='0'){ x=(x<<1)+(x<<3)+c-'0';c=getchar();} x*=y; } void o(int x){ if(x<0){p('-');x=-x;} if(x>9)o(x/10); p(x%10+'0'); } struct Node{ int l; int r; int v; bool operator < (const Node &k) const{ return v<k.v; } }E[2*N]; struct node{ int n; int v; node *next; }*e[2*N]; void push(int x,int y,int v){ node *p; p=new node(); p->n=y; p->v=v; if(e[x]==0) e[x]=p; else{ p->next=e[x]->next; e[x]->next=p; } } void build(int now){ deep[now]=deep[f[now][0]]+1; for(int i=1;(1<<i)<=deep[now];i++){ f[now][i]=f[f[now][i-1]][i-1]; g[now][i]=max(g[now][i],g[f[now][i-1]][i-1]); g[now][i]=max(g[now][i],g[now][i-1]); } for(node *i=e[now];i!=NULL;i=i->next){ if(i->n!=f[now][0]){ f[i->n][0]=now; g[i->n][0]=max(i->v,g[i->n][0]); build(i->n); } } } int query(int x,int y){ int ans=0; if(deep[x]<deep[y]) swap(x,y); int c=deep[x]-deep[y]; for(int i=0;i<=log2(c);i++){ if((1<<i)&c){ ans=max(ans,g[x][i]); x=f[x][i]; } } if(x==y) return ans; for(int i=log2(deep[x]);i>=0;i--){ if(f[x][i]!=f[y][i]){ ans=max(ans,g[x][i]); ans=max(ans,g[y][i]); x=f[x][i]; y=f[y][i]; } } ans=max(ans,g[x][0]); ans=max(ans,g[y][0]); return ans; } int find(int x){ if(d[x]==x) return x; return d[x]=find(d[x]); } signed main(){ in(n);in(m); For(i,1,m){ in(E[i].l);in(E[i].r);in(E[i].v); } For(i,1,n) d[i]=i; sort(E+1,E+m+1); For(i,1,m){ if(find(E[i].l)!=find(E[i].r)){ d[find(E[i].l)]=find(E[i].r); push(E[i].l,E[i].r,E[i].v); push(E[i].r,E[i].l,E[i].v); } } f[1][0]=1; build(1); in(T); while(T--){ in(x);in(y); o(query(x,y));p(' '); } return 0; }