BZOJ 4668 冷战 发表于 2017-03-29 | 更新于 2018-06-17 Link感觉非常有意思啊 Solution启发式合并的并查集树高O(logn)O(\log n)O(logn),那么直接在树上暴力LCA暴力最值就好啦。。。 之前还没见过这么玩的呢。。 Code123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263#include "lucida"using std::fill;using std::swap;const int MAXN=500000+11;int fa[MAXN],val[MAXN],sz[MAXN];int Root(int x) { while(fa[x]) { x=fa[x]; } return x;}void Union(int x,int y,int id) { int rx=Root(x),ry=Root(y); if(rx!=ry) { if(sz[rx]<sz[ry]) { swap(rx,ry); } fa[ry]=rx;val[ry]=id; sz[rx]+=sz[ry]; }}int LCA(int x,int y) { static int us[MAXN],ut; ++ut; do us[x]=ut; while ((x=fa[x])); while(us[y]!=ut) { y=fa[y]; } return y;}int Query(int x,int y) { if(Root(x)!=Root(y)) { return 0; } else { int lca=LCA(x,y),res=0; for(;x!=lca;x=fa[x]) { chkmx(res,val[x]); } for(;y!=lca;y=fa[y]) { chkmx(res,val[y]); } return res; }}int main() { freopen("input","r",stdin); int n,m;is>>n>>m; fill(sz+1,sz+1+n,1); int last=0,ec=0; for(int i=1;i<=m;++i) { int opt,u,v; is>>opt>>u>>v; u^=last;v^=last; if(opt==0) { Union(u,v,++ec); } else { last=Query(u,v); os<<last<<'\n'; } } return 0;}