题目:https://loj.ac/problem/10132

#include<bits/stdc++.h>
using namespace std;
int n,m,tot=,N,k=,head[];
struct node{
int to,next,w;
}e[];
int depth[],grand[][],c[],num[];
long long d[];
void add(int x,int y,int c)
{
e[++tot].next=head[x],e[tot].w=c,e[tot].to=y,head[x]=tot;
}
void init()
{
N=floor(log(n+0.0)/log(2.0));
depth[]=;
}
void dfs(int x)
{
num[x]=++k;c[k]=x;
for(int i=;i<=N;i++)grand[x][i]=grand[grand[x][i-]][i-];
for(int i=head[x];i;i=e[i].next)
{
int v=e[i].to;
if(v==grand[x][])continue;
depth[v]=depth[x]+;
grand[v][]=x;
d[v]=d[x]+e[i].w;
dfs(v);
}
}
int lca(int a,int b)
{
if(depth[a]>depth[b]) swap(a,b);
for(int i=N;i>=;i--){
if(depth[a]<depth[b]&&depth[grand[b][i]]>=depth[a]) b=grand[b][i];
}
if(a==b) return a;
for(int i=N;i>=;i--){
if(grand[a][i]!=grand[b][i]){a=grand[a][i],b=grand[b][i];}
}
return grand[a][];
}
set<int> s;
#define Auto set<int>::iterator
Auto Left(Auto t)
{
if(t==s.begin()) return --s.end();
return --t;
}
Auto Right(Auto t)
{
if(t==--s.end()) return s.begin();
return ++t;
}
long long dist(int x,int y)
{
return d[x]+d[y]-(d[lca(x,y)]<<);
}
int main()
{
char ch[];
scanf("%d",&n);
for(int i=;i<n;i++)
{
int x,y,z;scanf("%d%d%d",&x,&y,&z);
add(x,y,z),add(y,x,z);
}
init();
dfs();
scanf("%d",&m);
Auto l,r;
long long ans=;
for(int i=;i<=m;i++){
scanf("%s",ch);
if(ch[]=='?') printf("%lld\n",ans>>);
else{
int x;
scanf("%d",&x);
if(ch[]=='+')
{
if(!s.empty())
{
r=s.lower_bound(num[x]);
if(r==s.end())r=s.begin();
l=Left(r);
ans+=dist(c[*l],x)+dist(x,c[*r])-dist(c[*l],c[*r]);
}
s.insert(num[x]);
}
else{
r=s.find(num[x]);
l=Left(r);r=Right(r);
ans-=dist(c[*l],x)+dist(x,c[*r])-dist(c[*l],c[*r]);
s.erase(num[x]);
}
}
}
return ;
}

lca:异象石(set+dfs序)的更多相关文章

  1. 蓝皮书:异象石 【dfs序+lca】

    题目详见蓝皮书[算法竞赛:进阶指南]. 题目大意: 就是给你一颗树,然后我们要在上面进行三种操作:  1.标记某个点  或者  2.撤销某个点的标记  以及   3.询问标记点在树上连通所需的最短总边 ...

  2. Tsinsen A1505. 树(张闻涛) 倍增LCA,可持久化线段树,DFS序

    题目:http://www.tsinsen.com/A1505 A1505. 树(张闻涛) 时间限制:1.0s   内存限制:512.0MB    总提交次数:196   AC次数:65   平均分: ...

  3. 洛谷P3379 【模板】最近公共祖先(LCA)(dfs序+倍增)

    P3379 [模板]最近公共祖先(LCA) 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询 ...

  4. 【BZOJ】1146: [CTSC2008]网络管理Network(树链剖分+线段树套平衡树+二分 / dfs序+树状数组+主席树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1146 第一种做法(时间太感人): 第二种做法(rank5,好开心) ================ ...

  5. BZOJ3159决战——树链剖分+非旋转treap(平衡树动态维护dfs序)

    题目描述 输入 第一行有三个整数N.M和R,分别表示树的节点数.指令和询问总数,以及X国的据点. 接下来N-1行,每行两个整数X和Y,表示Katharon国的一条道路. 接下来M行,每行描述一个指令或 ...

  6. suoi22 WRX知识树(dfs序)

    把一条路径拆成到根的四个链(两端点.lca和fa[lca]),然后给dfs序中链的端点做单点修改.区间查询它的子树和再加上它原来的权值就可以了 #include<bits/stdc++.h> ...

  7. 【BZOJ1103】大都市meg(DFS序,树状数组)

    题意:有一颗树,1号点为根,保证编号小的点深度较小,初始状态每条边都没有被标记,要求实现两个操作在线: A:将连接x,y的边标记 W:查询从1到x的路径上有多少条边未被标记 n<=2*10^5 ...

  8. bzoj 2819 Nim(BIT,dfs序,LCA)

    2819: Nim Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1596  Solved: 597[Submit][Status][Discuss] ...

  9. BZOJ 2819: Nim( nim + DFS序 + 树状数组 + LCA )

    虽然vfleaking好像想卡DFS...但我还是用DFS过了... 路径上的石堆异或和=0就是必败, 否则就是必胜(nim游戏). 这样就变成一个经典问题了, 用DFS序+BIT+LCA就可以在O( ...

随机推荐

  1. Maven中dependencyManagement作用说明

    https://blog.csdn.net/helllochun/article/details/81564921 在Maven多模块的时候,管理依赖关系是非常重要的,各种依赖包冲突,查询问题起来非常 ...

  2. maven将Jar安装进仓库

    mvn install:install-file -DgroupId=com.microsoft.sqlserver -DartifactId=sqljdbc4 -Dversion=4.4 -Dpac ...

  3. 如何获取文件夹下所有文件名称(windows)

    1. win+R -> cmd 打开dos命令窗口 2. 打开需获取文件名的位置 3. 获取名称 命令格式:dir /b >> 文件目标盘符:\文件夹位置(可省略)\目标名称.目标后 ...

  4. day26——tyoe元类与object的联系、反射、函数与方法的区别、双下方法

    day26 type元类与object联系 type 获取对象从属于的类 python 中一切皆对象, 类在某种意义上也是一个对象,python中自己定义的类,以及大部分内置类,都是由type元类(构 ...

  5. AVR单片机教程——数码管

    先解答之前一个思考题:如果不把引脚配置为输出而写高电平,连接LED会怎样? 实验结果是,LED会亮,但相比于输出高电平的情况,亮度很低.这是为什么呢? 通过上一篇教程我们知道,引脚输入输出模式是由寄存 ...

  6. hadoop2.x大数据视频教程(十二天学会)

  7. yum命令安装jdk

    1.查看是否已安装JDK,卸载 yum list installed |grep java java--openjdk.x86_64 :.b13.el7_5 @updates java--openjd ...

  8. Robot Arms AtCoder - 4432 (构造)

    大意: 给定平面上$n$个点$(x_i,y_i)$. 要求构造一个序列$d$, $d_i$表示每步走的距离, 再构造$n$个命令串, 要求从原点出发按照第$i$个命令走, 走完恰好到达$(x_i,y_ ...

  9. 【1】TOPK最小的K个数(多种方法比较)

    (头条) 最小的第K个数也是和这题topK一样的思路 1.全排序  时间复杂度O(nlogn) 2.Partiton思想 时间复杂度O(n)  (因为不需要像快排一样对所有的分段都两两Partitio ...

  10. Spring Boot整合Mybatis完成级联一对多CRUD操作

    在关系型数据库中,随处可见表之间的连接,对级联的表进行增删改查也是程序员必备的基础技能.关于Spring Boot整合Mybatis在之前已经详细写过,不熟悉的可以回顾Spring Boot整合Myb ...