bzoj3991: [SDOI2015]寻宝游戏
来源:互联网 发布:若奥马里奥fm数据 编辑:程序博客网 时间:2024/04/29 04:19
刚刚学会虚树,有空补个详解。
显然按照dfs序走是最优解法,答案就是相邻两个点距离+第一个和最后一个距离。这玩意写平衡树怕不是写死…于是就用上了从学oi以来只用过一次的set。。。
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<set>#define ll long longusing namespace std;int read(){ char ch=getchar();int f=0,x=1; while(ch<'0'||ch>'9'){if(ch=='-') x=-1;ch=getchar();} while(ch>='0'&&ch<='9'){f=(f<<1)+(f<<3)+ch-'0';ch=getchar();} return f*x;}int n,m,d[100005],head[100005],f[100005][25],tot;int id[100005],now;bool vis[100005];int w[100005];set<int> s;set<int> :: iterator it;ll ans,pre[100005];struct node{ int from; int to; int next; ll w;}edge[500005];void add(int u,int v,ll w){ edge[tot].from=u; edge[tot].to=v; edge[tot].next=head[u]; edge[tot].w=w; head[u]=tot++;}void dfs(int x,int fa,int dep){ f[x][0]=fa; id[x]=++now; w[now]=x; d[x]=dep; for(int i=head[x];i!=-1;i=edge[i].next) { if(edge[i].to==fa) continue; pre[edge[i].to]=pre[x]+edge[i].w; dfs(edge[i].to,x,dep+1); }}void work(){ for(int j=1;j<=20;j++) { for(int i=1;i<=n;i++) f[i][j]=f[f[i][j-1]][j-1]; }}void move(int &x,int dep){ for(int i=20;i>=0;i--) { if(d[f[x][i]]>=dep) x=f[x][i]; }}int getlca(int x,int y){ if(d[x]>d[y]) swap(x,y); if(d[x]!=d[y]) move(y,d[x]); if(x==y) return x; for(int i=20;i>=0;i--) { if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i]; } return f[x][0];}ll dis(int x,int y){ return pre[x]+pre[y]-pre[getlca(x,y)]*2;}int ne(int x){ it=s.find(id[x]); return ++it==s.end()?0:w[*it];}int pr(int x){ it=s.find(id[x]); return it==s.begin()?0:w[*--it];}void add(int x){ s.insert(id[x]); int l=pr(x),r=ne(x); if(l) ans+=dis(l,x); if(r) ans+=dis(x,r); if(l&&r) ans-=dis(l,r);}void erase(int x){ int l=pr(x),r=ne(x); if(l) ans-=dis(l,x); if(r) ans-=dis(x,r); if(l&&r) ans+=dis(l,r); s.erase(id[x]);}int main(){ memset(head,-1,sizeof(head)); n=read();m=read(); for(int i=1;i<n;i++) { int u=read(),v=read(); ll w=read(); add(u,v,w); add(v,u,w); } dfs(1,0,1); work(); for(int i=1;i<=m;i++) { int x=read(); if(vis[x]) erase(x); else add(x); vis[x]^=1; printf("%lld\n",s.size()?ans+dis(w[*s.begin()],w[*--s.end()]):0); }}
阅读全文
0 0
- 【SDOI2015】【BZOJ3991】寻宝游戏
- bzoj3991: [SDOI2015]寻宝游戏
- [BZOJ3991] [SDOI2015]寻宝游戏
- BZOJ3991: [SDOI2015]寻宝游戏
- BZOJ3991: [SDOI2015]寻宝游戏
- 【SDOI2015】bzoj3991 寻宝游戏
- bzoj3991: [SDOI2015]寻宝游戏
- [BZOJ3991]SDOI2015寻宝游戏|set|虚树
- 【bzoj3991】【SDOI2015】【寻宝游戏】【dfs序】
- [BZOJ3991][SDOI2015]寻宝游戏(dfs序+lca+set)
- [bzoj3991][SDOI2015]寻宝游戏 lca+set+dfs序
- bzoj3991 [SDOI2015]寻宝游戏 (虚树+set+dfs序 )
- [BZOJ3991][SDOI2015]寻宝游戏(dfs序+set/平衡树)
- 【bzoj3991】 寻宝游戏
- bzoj3991 寻宝游戏 dfs&set
- 3991: [SDOI2015]寻宝游戏
- 3991: [SDOI2015]寻宝游戏
- BZOJ 3991: [SDOI2015]寻宝游戏
- 概念学习
- Activiti工作流学习入门其一
- DAY3每日Python练习
- I2C总线死锁
- java.lang.NoClassDefFoundError net.sf.ezmorph.Morpher问题解决-pom版
- bzoj3991: [SDOI2015]寻宝游戏
- js事件冒泡
- Python核心编程 第二章--Network Programming
- Java作业-Map排序
- Java——集合、迭代器
- 序列化对象后单例模式被破坏解决方案
- Kali Nethunter安装指南
- 浅谈UML学习笔记之用例图
- centos5安装yum源