spoj qtree Query on a tree 【线段树+树链剖分】
来源:互联网 发布:淘宝捡漏在什么地方 编辑:程序博客网 时间:2024/05/22 15:23
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <stack>#include <set>#include <map>#include <string>#include <cmath>#include <stdlib.h>#include <time.h>using namespace std;typedef vector<int> VI;typedef unsigned long long ull;typedef long long ll;typedef double db;const ll mod=1000000007;const int N=10000+10;const int inf=0x7fffffff;struct edge{ int a,b,w;}g[2*N];vector<int>v[N];int fa[N],dep[N],sz[N],son[N],w[N],vis[N],top[N],tot;void dfs1(int x,int f){ int y,mx=-1; vis[x]=1; fa[x]=f; sz[x]=1; dep[x]=dep[f]+1; for(int i=0;i<v[x].size();i++) { y=v[x][i]; if(vis[y]==1) continue; dfs1(y,x); sz[x]+=sz[y]; if(sz[y]>mx){mx=sz[y];son[x]=y;} }}void dfs2(int x,int tp){ top[x]=tp; if(son[x]!=0) { w[x]=tot++; dfs2(son[x],tp); } else { w[x]=tot++; return ; } int y; for(int i=0;i<v[x].size();i++) { y=v[x][i]; if(y!=son[x]&&y!=fa[x]) dfs2(y,y); }}struct Tree{ int l,r,mx;}tree[4*N];void build(int o,int l,int r){ tree[o].l=l; tree[o].r=r; tree[o].mx=0; if(l!=r) { int mid=(l+r)/2; build(o*2,l,mid); build(o*2+1,mid+1,r); }}void update(int o,int l,int r,int val){ if(l<=tree[o].l&&tree[o].r<=r) { tree[o].mx=val; } else { int mid=(tree[o].l+tree[o].r)/2; if(l<=mid) update(o*2,l,r,val); if(r>mid) update(o*2+1,l,r,val); tree[o].mx=max(tree[o*2].mx,tree[o*2+1].mx); }}int query(int o,int l,int r){ if(l<=tree[o].l&&tree[o].r<=r) { return tree[o].mx; } else { int ans=0; int mid=(tree[o].l+tree[o].r)/2; if(l<=mid) ans=max(ans,query(o*2,l,r)); if(r>mid) ans=max(ans,query(o*2+1,l,r)); return ans; }}int Find(int x,int y){ int f1=top[x],f2=top[y]; int tmp=0; while(f1!=f2) { if(dep[f1]<dep[f2]) { swap(f1,f2); swap(x,y); } tmp=max(tmp,query(1,w[f1],w[x])); x=fa[f1]; f1=top[x]; } if(x==y) return tmp; if(dep[x]>dep[y]) swap(x,y); return max(tmp,query(1,w[son[x]],w[y]));}int main(){ //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int _,n,a,b,c; char s[100]; scanf("%d",&_); while(_--) { scanf("%d",&n); for(int i=1;i<=n;i++) v[i].clear(); for(int i=0;i<n-1;i++) { scanf("%d%d%d",&a,&b,&c); g[i].a=a;g[i].b=b; g[i].w=c; v[a].push_back(b); v[b].push_back(a); } memset(vis,0,sizeof(vis)); memset(son,0,sizeof(son)); tot=1; dep[0]=0; dfs1(1,0); dfs2(1,1); build(1,1,tot-1); for(int i=0;i<n-1;i++) { a=g[i].a;b=g[i].b; if(dep[a]>dep[b]) swap(g[i].a,g[i].b); update(1,w[g[i].b],w[g[i].b],g[i].w); } while(~scanf("%s",s)) { if(s[0]=='D') break; scanf("%d%d",&a,&b); if(s[0]=='C') update(1,w[g[a-1].b],w[g[a-1].b],b); else printf("%d\n",Find(a,b)); } } return 0;}
0 0
- Spoj Query on a tree SPOJ - QTREE(树链剖分+线段树)
- SPOJ - QTREE 375 Query on a tree 树链剖分+线段树
- SPOJ QTREE Query on a tree [树链剖分+线段树]
- spoj qtree Query on a tree 【线段树+树链剖分】
- SPOJ QTREE Query on a tree(树链剖分+线段树)
- SPOJ QTREE(Query on a tree树链剖分)
- SPOJ QTREE Query on a tree --树链剖分
- [ SPOJ - QTREE]Query on a tree && 树链剖分
- SPOJ QTREE Query on a tree 树链剖分
- SPOJ QTREE Query on a tree 树链剖分
- 【树链剖分】[SPOJ-QTREE]Query on a tree
- SPOJ QTREE - Query on a tree 【树链剖分】
- SPOJ QTREE- Query on a tree (树链剖分)
- [spoj QTREE Query on a tree]树链剖分
- 【SPOJ】QTREE - Query on a tree(树链剖分+线段树(基于边权))
- SPOJ QTREE 375. Query on a tree
- SPOJ QTREE Query on a tree
- SPOJ - QTREE Query on a tree(树剖)
- Service全面总结
- Qt多线程笔记 (2)
- html 背景图片实现 宽度自适应,高度为背景图片高度 解决发案
- 有哪些靠谱的服务器安全软件?
- HDU 3487(伸展树模板)
- spoj qtree Query on a tree 【线段树+树链剖分】
- MATLAB图像处理函数
- Bootstrap表格排序插件、日期选择插件
- [鸟哥笔记精编]7家信息流广告渠道报价及投放实用指南(2016更新)
- 实现点击超链接<a>标签,点击的标签变色,标注
- MySQL索引长度限制问题
- 转:SPI、I2C、UART、USART串行总线协议的区别
- 手机号获取归属地 获取到到城市
- 点2次返回键提示再按一次退出功能