BZOJ 3991 set维护dfs序
思路:
set按照dfn排序
两点之间的距离可以O(logn)算出来
加一个点-> now
ans+=dis(pre,now)+dis(now,next)-dis(pre-next);
删一个点同理
最后加上dis(begin,end)即可
//By SiriusRen
#include <set>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=200050;
typedef long long ll;
int first[N],next[N],v[N],w[N],tot,cnt,rev[N];
int n,m,xx,yy,zz,dfn[N],deep[N],fa[N/2][20];
ll ans,wei[N],temp;
struct cmp{bool operator()(int x,int y){return dfn[x]<dfn[y];}};
set<int,cmp>s;set<int,cmp>::iterator it,itpre,itnext;
void add(int x,int y,int z){w[tot]=z,v[tot]=y,next[tot]=first[x],first[x]=tot++;}
void dfs(int x){dfn[x]=++cnt;for(int i=first[x];~i;i=next[i])if(v[i]!=fa[x][0])deep[v[i]]=deep[x]+1,wei[v[i]]=wei[x]+w[i],fa[v[i]][0]=x,dfs(v[i]);
}
int lca(int x,int y){if(deep[x]<deep[y])swap(x,y);for(int i=19;i>=0;i--)if(deep[x]-(1<<i)>=deep[y])x=fa[x][i];if(x==y)return x;for(int i=19;i>=0;i--)if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];return fa[x][0];
}
ll dis(int x,int y){return wei[x]+wei[y]-2*wei[lca(x,y)];}
int main(){memset(first,-1,sizeof(first));scanf("%d%d",&n,&m);for(int i=1;i<n;i++){scanf("%d%d%d",&xx,&yy,&zz);add(xx,yy,zz),add(yy,xx,zz);}dfs(1),deep[1]=1;for(int j=1;j<=19;j++)for(int i=1;i<=n;i++)fa[i][j]=fa[fa[i][j-1]][j-1];while(m--){scanf("%d",&xx);rev[xx]^=1;if(rev[xx]){s.insert(xx),it=s.lower_bound(xx);itnext=++it,--it;if(it!=s.begin())itpre=--it,++it,ans+=dis(*itpre,*it);if(itnext!=s.end())ans+=dis(*itnext,*it);if(it!=s.begin()&&itnext!=s.end())ans-=dis(*itpre,*itnext);}else{it=s.lower_bound(xx);itnext=++it,--it;if(it!=s.begin())itpre=--it,++it,ans-=dis(*itpre,*it);if(itnext!=s.end())ans-=dis(*itnext,*it);if(it!=s.begin()&&itnext!=s.end())ans+=dis(*itpre,*itnext);s.erase(it);}it=s.end();if(s.size()>1)temp=dis(*s.begin(),*(--it));else temp=0;printf("%lld\n",ans+temp);}
}
转载于:https://www.cnblogs.com/SiriusRen/p/6532016.html
BZOJ 3991 set维护dfs序相关推荐
- 【BZOJ 3729】3729: Gty的游戏 (Splay维护dfs序+博弈)
未经博主同意不得转载 3729: Gty的游戏 Time Limit: 20 Sec Memory Limit: 128 MB Submit: 448 Solved: 150 Descriptio ...
- BZOJ2690: 字符串游戏(平衡树动态维护Dfs序)
Description 给定N个仅有a~z组成的字符串ai,每个字符串都有一个权值vi,有M次操作,操作分三种: Cv x v':把第x个字符串的权值修改为v' Cs x a':把第x个字符串修改成a ...
- bzoj3786星系探索(splay维护dfs序)
Description 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均有且仅有一个依赖星球.主星球 ...
- bzoj 2434 [Noi2011]阿狸的打字机(AC自动机+fail树+dfs序+树状数组)
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 3521 Solved: 1913 [Submit][S ...
- 【BZOJ 3991】 [SDOI2015]寻宝游戏
3991: [SDOI2015]寻宝游戏 Time Limit: 40 Sec Memory Limit: 128 MB Submit: 251 Solved: 137 [Submit][Status ...
- 牛客多校4 - Ancient Distance(树上倍增+dfs序+线段树)
题目链接:点击查看 题目大意:给出一棵 n 个节点且以点 1 为根节点的的树,现在给出一个 k ,需要在树上选择 k 个关键点,使得 n 个点到达根节点的路径上,出现的最近的关键点的距离的最大值最小, ...
- 【BZOJ3252】攻略 DFS序+线段树(模拟费用流)
[BZOJ3252]攻略 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏. 今天他得到了一款新游戏<XX半岛> ...
- Jittery Roads Gym - 100889J (虚树 + DP + dfs 序, + 线段树)
每次给一个点集, 求每个点到其他所有点的最大距离: 会修改边权; 修改边权之后, 我们可以用 dfs 序 + 线段树维护 当前点到根节点的距离. 还可以用树状数组 + 差分思想 维护. { dfs 序 ...
- 线段树 ---- D. Power Tree(离线dfs序+线段树维护树上多条路径和的技巧)
题目链接 题目大意: 一开始给你只有一个点111的树,有qqq次询问.每次询问有两种操作 1pv1\;p\;v1pv 就是把最小的没加入的点,加入这个树,它的父亲是ppp,权值是vvv 2u2\;u2 ...
- BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 2545 Solved: 1419 [Submit][S ...
最新文章
- R语言效用分析 ( 效能分析、Power analysis)确定样本量、假设检验与两类错误、pwr包进行效用分析 ( 效能分析、Power analysis)的常用函数列表
- EXCEL IFS函数的使用
- 08 域控 架构主机 转移_win2000域控迁移至win2008
- JSON字符串,JSON对象,JSON数组,实体类转换
- VOT目标路径可视化
- 对于STM32的ADC芯片的思考
- Kyan网络监控设备账号密码泄露漏洞
- PDF文件JAVA去水印源码,给pdf文件添加防伪水印logo(附工程源码下载)
- 以编程方式使用 Microsoft Office Visio 2003 ActiveX 控件(经经经经经典)
- html设置文本域的,HTML-文本域属性设置
- ie11 java 下载文件_Javaweb实现上传下载文件的多种方法
- 通过Python爬虫按关键词抓取相关的新闻
- 小度的进攻,智能音箱的“二战”
- [Java]Maven学习笔记(尚硅谷2022)
- Android:从零开始打造自己的深度链接库(一):ARouter简介
- acmore|acmore.cc1211采油区域1212会议中心1213抢掠计划APIO2009
- C#进行Visio二次开发之Web查看Visio图纸
- 计算机专业研究生如何看待计算机期刊论文
- 考虑不同充电需求的电动汽车协调充电调度方法 提出了一种电动汽车(EV)的协调充电调度方法
- android openal播放器,Android OpenAL 录音参数不正确