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( ...
随机推荐
- ArcGIS Server 10.2忘记用户名密码的解决方案
忘记了ArcGIS Server Manager的密码,可以采用以下方法进行重置. 1.找到ArcGIS Server的安装目录 D:\Program Files\ArcGIS\Server\tool ...
- 定时杀死mysql中sleep的进程
#!/bin/sh date=`date +%Y%m%d\[%H:%M:%S]` n=`mysqladmin -uroot -p** processlist | grep -i sleep | wc ...
- Python的编码规范
7. 什么是 PEP8? 8号Python增强提案,是针对Python代码格式而编写的风格指南 8. 了解 Python 之禅么? 通过 import this 语句可以获取其具体的内容.它告诉大家何 ...
- [转帖]浅谈分布式一致性与CAP/BASE/ACID理论
浅谈分布式一致性与CAP/BASE/ACID理论 https://www.cnblogs.com/zhang-qc/p/6783657.html ##转载请注明 CAP理论(98年秋提出,99年正式发 ...
- java实现限流
问题产生,当调用一个接口很频繁的时候,比如每秒调用一个接口100次.业务提现在抢购等.这时我们的服务器处理不过来就会拒绝服务,宕机等等...显然这不是我们需要的. 因此产生了限流这个.限流是什么呢,就 ...
- 复杂的sql参考(3)
SELECT apply.assets_code, apply.loan_apply_code, cust.cust_name, cust.id_no, cust.mobile, platform.p ...
- JDK和J2EE有什么关系
JDK(Java Development Kit)是Java 开发工具J2EE是Java一个平台 Java 平台有三个版本,这使软件开发人员.服务提供商和设备生产商可以针对特定的市场进行开发:* Ja ...
- python 3.url了解与基础使用
URL使用 视图: 我们运行项目在网页上查看到的我们称之为视图 视图一般在views.py下编辑 它的第一个参数永远都是request,通过它请求一些数据返回给网页给我们查看. 视图函数的返回结果必须 ...
- 面试官再问Redis分布式锁如何续期?这篇文章甩 他一脸
一.真实案例 二.Redis分布式锁的正确姿势 据肥朝了解,很多同学在用分布式锁时,都是直接百度搜索找一个Redis分布式锁工具类就直接用了.关键是该工具类中还充斥着很多System.out.prin ...
- 【开发笔记】- 发送邮件(通过JavaMail发送)
前段时间在工作中用到了邮件发送监控的报警信息,今天在这个记录一下JavaMail的邮件工具类. 下边为用到的JavaMail的jar包的pom依赖.这里用的是JavaMail的1.4.6的版本. &l ...