bzoj3991: [SDOI2015]寻宝游戏--DFS序+LCA+set动态维护
之前貌似在hdu还是poj上写过这道题。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<set>
#define maxn 100010
#define INF 0x7fffffff
using namespace std;
struct node{
int to,cost,next;
}e[maxn*];
int n,m,u,v,c,logn,tot,time,x;
],head[maxn],dep[maxn],id[maxn],pos[maxn];
];
bool flag[maxn];
long long ans,t;
set<int> st;
inline void insert(int u, int v, int c){
e[++tot].to=v;
e[tot].cost=c;
e[tot].next=head[u];
head[u]=tot;
}
inline void dfs(int u, int f, int d, int c){
pos[u]=++time; id[time]=u;
dep[u]=d;
fa[u][]=f; dis[u][]=c;
; i<=logn; i++) fa[u][i]=fa[fa[u][i-]][i-];
; i<=logn; i++) dis[u][i]=dis[u][i-]+dis[fa[u][i-]][i-];
; i=e[i].next)
,e[i].cost);
}
inline long long lca(int u, int v){
;
if (dep[u]>dep[v]) swap(u,v);
while (dep[u]<dep[v]){
; i--)
if (dep[u]<dep[fa[v][i]]){
sum+=dis[v][i];
v=fa[v][i];
}
sum+=dis[v][];
v=fa[v][];
}
if (u==v) return sum;
; i--)
if (fa[u][i]!=fa[v][i]){
sum+=dis[u][i]+dis[v][i];
u=fa[u][i]; v=fa[v][i];
}
sum+=dis[u][]+dis[v][];
return sum;
}
int main(){
scanf("%d%d", &n, &m);
logn=; <<logn)<n) logn++;
tot=-; memset(head,-,sizeof(head));
; i<n; i++){
scanf("%d%d%d", &u, &v, &c);
insert(u,v,c);
insert(v,u,c);
}
time=;
dfs(,,,);
st.insert(-INF); st.insert(INF);
while (m--){
scanf("%d", &x);
if (!flag[x]){
flag[x]=;
int l=*--st.lower_bound(pos[x]), r=*st.upper_bound(pos[x]);
st.insert(pos[x]);
if (l !=-INF) ans+=lca(id[l],x);
if (r != INF) ans+=lca(x,id[r]);
if (l!=-INF && r!=INF) ans-=lca(id[l],id[r]);
}
else{
flag[x]=;
st.erase(pos[x]);
int l=*--st.lower_bound(pos[x]), r=*st.upper_bound(pos[x]);
if (l!=-INF) ans-=lca(id[l],x);
if (r!= INF) ans-=lca(x,id[r]);
if (l!=-INF && r!=INF) ans+=lca(id[l],id[r]);
}
){
int l=*++st.lower_bound(-INF), r=*--st.lower_bound(INF);
t=lca(id[l],id[r]);
}
printf("%lld\n", ans+t);
}
;
}
bzoj3991: [SDOI2015]寻宝游戏--DFS序+LCA+set动态维护的更多相关文章
- [BZOJ 3991][SDOI2015]寻宝游戏(dfs序)
题面 小B最近正在玩一个寻宝游戏,这个游戏的地图中有N个村庄和N-1条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩家可以任意选择一个村庄,瞬间转移到这个村庄,然后可以任意在地图的道路 ...
- [BZOJ3991][SDOI2015]寻宝游戏
[BZOJ3991][SDOI2015]寻宝游戏 试题描述 小B最近正在玩一个寻宝游戏,这个游戏的地图中有N个村庄和N-1条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩家可以任意选择 ...
- CH#56C 异象石 和 BZOJ3991 [SDOI2015]寻宝游戏
异象石 CH Round #56 - 国庆节欢乐赛 描述 Adera是Microsoft应用商店中的一款解谜游戏. 异象石是进入Adera中异时空的引导物,在Adera的异时空中有一张地图.这张地图上 ...
- BZOJ3991 [SDOI2015]寻宝游戏 【dfs序 + lca + STL】
题目 小B最近正在玩一个寻宝游戏,这个游戏的地图中有N个村庄和N-1条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩家可以任意选择一个村庄,瞬间转移到这个村庄,然后可以任意在地图的道路 ...
- luogu3320 寻宝游戏 (dfs序+倍增lca+set)
一定是从随便某个点开始,然后按着dfs序的顺序跑一圈是最好的 所以说,新加一个点x,就减少了dis(pre,next),增加了dis(pre,x),dis(x,nxt) 删掉一个点同理 这个可以用se ...
- [bzoj3991][SDOI2015]寻宝游戏_树链的并_倍增lca_平衡树set
寻宝游戏 bzoj-3991 SDOI-2015 题目大意:题目链接. 注释:略. 想法:我们发现如果给定了一些点有宝物的话那么答案就是树链的并. 树链的并的求法就是把所有点按照$dfs$序排序然后相 ...
- bzoj3991 [Sdoi2015]寻宝游戏 set动态维护虚树+树链求并
题目大意:支持多次操作,增加或删除一个关键点 动态维护虚树边权和*2 分析:可以用树链求并的方法,最后减去虚树的根到1距离 注意到树链求并是所有点到根距离-所有dfn序相邻两点的LCA到根距离 找df ...
- bzoj3991 [SDOI2015]寻宝游戏 树链的并
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3991 题解 貌似这个东西叫做树链的并,以前貌似写过一个类似的用来动态维护虚树. 大概就是最终的 ...
- 【dfs序】【set】bzoj3991 [Sdoi2015]寻宝游戏
在考试代码的基础上稍微改改就a了……当时为什么不稍微多想想…… 插入/删除一个新节点时就把其dfn插入set/从set中删除. 当前的答案就是dfn上相邻的两两节点的距离和,再加上首尾节点的距离. 比 ...
随机推荐
- hadoop常用命令
hdfs fsck / 副本数量 hdfs dfsadmin -report hdfs大小
- Mongdb使用客户端
安装Robomongo图形化管理工具 Robomongo是一个基于 Shell 的跨平台开源 MongoDB 管理工具.嵌入了 JavaScript 引擎和 MongoDB mogo . 只要你会使用 ...
- 从客户端(CourseIssueContent="<P>财务审计师岗位认证招生简章<BR>...")中检测到有潜在危险的 Request.Form 值。
说明: 请求验证过程检测到有潜在危险的客户端输入值,对请求的处理已经中止.该值可能指示危及应用程序安全的尝试,如跨站点的脚本攻击.通过在 Page 指令或 配置节中设置 validateRequest ...
- ADB常用的几个命令
1. 查看设备 adb devices 查看当前连接的设备, 连接到计算机的android设备或者模拟器将会列出显示 2. 安装软件 adb install [-r] [-s] <file> ...
- HTML5 重要标签及其属性学习
1.google字体:<link href="https://fonts.googleapis.com/css?family=Lobster" rel="style ...
- 黑客语(Leet)
黑客语(Leet) Leet是从网络发展起来的一种文字书写方式.通常将英语中的字母替换为数字和特殊符号.这种方式被很多黑客组织所使用.由于具有隐密性,所以它也广泛被用于密码中.使用Leet书写的密 ...
- delphi 中TStringList Clear 方法的时候该对象有没有被释放
delphi 中TStringList 通过function AddObject(const S: string; AObject: TObject): Integer; 方法添加了一个对象,请问我在 ...
- 静态数据成员(面向对象的static关键字)
静态数据成员: 在类内数据成员的声明前加上关键字static,该数据成员就是类内的静态数据成员.先举一个静态数据成员的例子. #include<iostream> using namesp ...
- MFC 定义和调用全局变量的一种方法
在CTestApp.h中声明一个int x;然后调用的方式如下: CTestApp *app = (CTestApp *)AfxGetApp(); //生成指向应用程序类的指针,Test处改为对应的项 ...
- java-数字类
浏览以下内容前,请点击并阅读 声明 对于6种基本的数字类型,java提供了相对应的类.Number类和六种细分的子类.