题目大意:给你一棵树,有两个操作1.修改一条边的值,2.询问从x到y路径上边的最大值

思路:如果树退化成一条链的话线段树就很明显了,然后这题就是套了个树连剖分,调了很久终于调出来第一个模板了

 #include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 100009
using namespace std;
int head[maxn],next[maxn*],point[maxn],son[maxn],size_k[maxn],id[maxn],value[maxn],now=,father[maxn],top[maxn];
int x[maxn],y[maxn],v[maxn],tree[maxn*],pos=,deep[maxn],n;
int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
void add(int x,int y,int v)
{
next[++now]=head[x];head[x]=now;
point[now]=y;value[now]=v;
}
int dfs(int k,int fa)
{
deep[k]=deep[fa]+;
father[k]=fa;
size_k[k]=;
int max_x=-;
son[k]=-;
for(int i=head[k];i;i=next[i])
{
if(point[i]==fa)continue;
dfs(point[i],k);
size_k[k]+=size_k[point[i]];
if(size_k[point[i]]>max_x)
{
max_x=size_k[point[i]];
son[k]=point[i];
}
}
}
void dfs2(int k,int fa,int pa)
{
id[k]=++pos;
top[k]=pa;
if(son[k]!=-)dfs2(son[k],k,pa);
for(int i=head[k];i;i=next[i])
{
if(point[i]!=fa && point[i]!=son[k])dfs2(point[i],k,point[i]);
}
}
void update(int node,int l,int r,int pos,int x)
{
if(l+==r){tree[node]=x;return;}
int mid=(l+r)>>;
if(pos<mid)update(node*,l,mid,pos,x);
else update(node*+,mid,r,pos,x);
tree[node]=max(tree[node*],tree[node*+]);
}
int query(int node,int l,int r,int ql,int qr)
{
if(ql<=l && r<=qr)return tree[node];
int mid=(l+r)>>;
int ans=-0x3f3f3f3f;
if(ql<mid)ans=max(query(node<<,l,mid,ql,qr),ans);
if(mid<qr)ans=max(query(node<<|,mid,r,ql,qr),ans);
return ans;
}
int find(int x,int y)
{
int fa=top[x],fb=top[y],temp=;
while(fa!=fb)
{
if(deep[fa]<deep[fb])
{
swap(fa,fb);
swap(x,y);
}
if(id[fa]>id[x]+)return -;
temp=max(temp,query(,,pos+,id[fa],id[x]+));
x=father[fa];fa=top[x];
}
if(x==y)return temp;
if(deep[x]<deep[y])swap(x,y);
if(id[y]+>id[x]+)return -;
return max(temp,query(,,pos+,id[son[y]],id[x]+));
}
int main()
{
int t;
t=read();
while(t--)
{
now=;
memset(head,,sizeof(head));
memset(tree,,sizeof(tree));
n=read();
for(int i=;i<n;i++)
{
x[i]=read();y[i]=read();v[i]=read();
add(x[i],y[i],v[i]);
add(y[i],x[i],v[i]);
}
deep[]=;
dfs(,);
dfs2(,,);
for(int i=;i<=n-;i++)
{
int u=deep[x[i]]>deep[y[i]]?x[i]:y[i];
update(,,pos+,id[u],v[i]);
}
int xx,yy;
char ch[];
while(true)
{
scanf("%s",ch);
if(ch[]=='D')break;
xx=read();yy=read();
if(ch[]=='Q')
{
printf("%d\n",find(xx,yy));
}
else if(ch[]=='C')
{
int u=deep[x[xx]]>deep[y[xx]]?x[xx]:y[xx];
update(,,pos+,id[u],yy);
}
else if(ch[]=='D')
{
break;
}
}
}
return ;
}

最新文章

  1. Tomcat 服务应用
  2. springMVC 配置CharacterEncodingFilter之后不起效果
  3. Ansible facts
  4. mysql高可用之DRBD + HEARTBEAT + MYSQL
  5. asp.net MVC ViewData详解
  6. 2013年度Python Git工具
  7. mini2440 MJPG_STREAMER 产生问题
  8. ArcGIS 设置地图显示范围大小
  9. web移动开发的小细节(持续添加)
  10. Entity Framework Core 执行SQL语句和存储过程
  11. 一次基于innobackupex备份及binlog的单表恢复操作
  12. 【BZOJ2576】[JSOI2011]序的计数 (动态规划)
  13. SpringBoot学习笔记&lt;一&gt;入门与基本配置
  14. jmeter负载机运行/添加压力机/分布式
  15. [C++ Primer Plus] 第5章、循环和关系表达式(二)课后习题
  16. ModuleNotFoundError: No module named &#39;win32api&#39;
  17. nginx: [emerg] mkdir() &quot;/var/temp/nginx/client&quot; failed (2: No such file or directory)
  18. 报错提示:mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in..的处理方式
  19. [TCO2009]NumberGraph
  20. LeetCode 234——回文链表

热门文章

  1. 华硕笔记本刷BIOS
  2. ycsb模板介绍
  3. centos中安装elasticsearch5.0
  4. UVA 12549 Sentry Robots (最小点覆盖)
  5. k sum(lintcode)
  6. var、let、const声明变量的区别
  7. FTP文传协议的应用
  8. Instance Methods are Curried Functions in Swift
  9. java面试宝典第三弹
  10. 【树形dp】7.14城市