lca:异象石(set+dfs序)
题目: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序)的更多相关文章
- 蓝皮书:异象石 【dfs序+lca】
题目详见蓝皮书[算法竞赛:进阶指南]. 题目大意: 就是给你一颗树,然后我们要在上面进行三种操作: 1.标记某个点 或者 2.撤销某个点的标记 以及 3.询问标记点在树上连通所需的最短总边 ...
- Tsinsen A1505. 树(张闻涛) 倍增LCA,可持久化线段树,DFS序
题目:http://www.tsinsen.com/A1505 A1505. 树(张闻涛) 时间限制:1.0s 内存限制:512.0MB 总提交次数:196 AC次数:65 平均分: ...
- 洛谷P3379 【模板】最近公共祖先(LCA)(dfs序+倍增)
P3379 [模板]最近公共祖先(LCA) 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询 ...
- 【BZOJ】1146: [CTSC2008]网络管理Network(树链剖分+线段树套平衡树+二分 / dfs序+树状数组+主席树)
http://www.lydsy.com/JudgeOnline/problem.php?id=1146 第一种做法(时间太感人): 第二种做法(rank5,好开心) ================ ...
- BZOJ3159决战——树链剖分+非旋转treap(平衡树动态维护dfs序)
题目描述 输入 第一行有三个整数N.M和R,分别表示树的节点数.指令和询问总数,以及X国的据点. 接下来N-1行,每行两个整数X和Y,表示Katharon国的一条道路. 接下来M行,每行描述一个指令或 ...
- suoi22 WRX知识树(dfs序)
把一条路径拆成到根的四个链(两端点.lca和fa[lca]),然后给dfs序中链的端点做单点修改.区间查询它的子树和再加上它原来的权值就可以了 #include<bits/stdc++.h> ...
- 【BZOJ1103】大都市meg(DFS序,树状数组)
题意:有一颗树,1号点为根,保证编号小的点深度较小,初始状态每条边都没有被标记,要求实现两个操作在线: A:将连接x,y的边标记 W:查询从1到x的路径上有多少条边未被标记 n<=2*10^5 ...
- bzoj 2819 Nim(BIT,dfs序,LCA)
2819: Nim Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1596 Solved: 597[Submit][Status][Discuss] ...
- BZOJ 2819: Nim( nim + DFS序 + 树状数组 + LCA )
虽然vfleaking好像想卡DFS...但我还是用DFS过了... 路径上的石堆异或和=0就是必败, 否则就是必胜(nim游戏). 这样就变成一个经典问题了, 用DFS序+BIT+LCA就可以在O( ...
随机推荐
- ThreadLocal源代码1
public class ThreadLocalTrxt { static ThreadLocal<Object> x1 = new ThreadLocal<Object>() ...
- centos7查看防火墙状态、关闭防火墙
查看防火墙状态: firewall-cmd --state 关闭防火墙: systemctl stop firewalld.service 禁止firewall开机启动: systemctl disa ...
- Python代码约定
建议遵守以下约定: 使用 4 个空格来缩进 永远不要混用空格和制表符 在函数之间空一行 在类之间空两行 字典,列表,元组以及参数列表中,在 , 后添加一个空格.对于字典,: 后面也添加一个空格 在赋值 ...
- *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
Warning提示的原因是 一些未使用的函数被编译进入芯片,浪费了RAM/ROM. 解决的方法: 1.将不用的函数注释: 2.在未使用函数的首尾加条件编译 #ifdef 函数名 和 #endif ,不 ...
- Linux下使用strip如何对库和可执行文件进行裁减
如果生成的可执行文件或库比较大,这时候就可以使用strip命令进行裁减,在嵌入式开发中,如果使用的交叉编译工具是arm-linux,则命令 是arm-linux-strip,如果是arm-uclibc ...
- postgresql学习之安装篇
---恢复内容开始--- 安装方法: 1.可以使用操作系统自带的安装源 2.可以使用官网下载的源码进行安装 3.可以使用编译好的包入.run格式的安装包安装(本文使用的是这种安装方法,下载地址http ...
- python爬虫-有道翻译-js加密破解
有道翻译-js加密破解 这是本地爬取的网址:http://fanyi.youdao.com/ 一.分析请求 我们在页面中输入:水果,翻译后的英文就是:fruit.请求携带的参数有很多,先将参数数据保存 ...
- tf.reduce_max的运用
a=np.array([[[[1],[2],[3]],[[4],[25],[6]]],[[[27],[8],[99]],[[10],[11],[12]]],[[[13],[14],[15]],[[16 ...
- Java知识回顾 (12) package
本资料来自于runoob,略有修改. 为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间. Java 使用包(package)这种机制是为了防止命名冲突,访问控制,提供搜索和定位类(cl ...
- 【转载】如何查看sqlserver客户端的版本号信息
在sqlserver的使用过程中,有时候可能会因为sqlserver版本过低等原因的导致无法附加以及还原数据库,我们可以通过sql server management studio软件的帮助菜单参看到 ...