异象石(就是sdio宝藏那题)
题解:
之前这道题写过两次题解了吧。。
实现的时候可以用set<int,cmp>来实现按照dfn排序
代码:
感觉别人的分类讨论比我的简单。。
但我觉得我这个写起来也不烦就不看别人的了。。
看了一下 发现他们是把一个的前驱后继处理为自己 于是就避免了分类讨论(我xxx)
linux复制出来行间距变成两倍了。。
#include <bits/stdc++.h>
using namespace std;
#define rll ll
#define IL inline
#define rep(i,h,t) for (rll i=h;i<=t;i++)
#define dep(i,t,h) for (rll i=t;i>=h;i--)
#define ll long long
const ll N=4e5;
struct re{
ll a,b,c;
}e[N*];
ll cnt,head[N],l;
ll bz[][N];
ll sum[N];
void arr(ll x,ll y,ll z)
{
e[++l].a=head[x];
e[l].b=y;
e[l].c=z;
head[x]=l;
}
ll dfn[N],dep[N];
void dfs(ll x,ll y)
{
dfn[x]=++cnt; dep[x]=dep[y]+; bz[][x]=y;
for (rll u=head[x];u;u=e[u].a)
{
rll v=e[u].b;
if (v!=y)
{
sum[v]=sum[x]+e[u].c;
dfs(v,x);
}
}
}
ll lca(ll x,ll y)
{
if (dep[x]<dep[y]) swap(x,y);
dep(i,,) if (dep[bz[i][x]]>=dep[y]) x=bz[i][x];
if (x==y) return x;
dep(i,,) if (bz[i][x]!=bz[i][y]) x=bz[i][x],y=bz[i][y];
return bz[][x];
}
struct cmp{
bool operator () (ll x,ll y)
{
return dfn[x]<dfn[y];
}
};
#define tp set<ll,cmp>::iterator
set<ll,cmp> S;
tp it,it2,it3;
IL tp pre(tp it)
{
tp it2=it; it2--; return(it2);
}
IL tp nxt(tp it)
{
tp it2=it; it2++; return(it2);
}
int main()
{
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
ios::sync_with_stdio(false);
ll n;
cin>>n;
rep(i,,n-)
{
ll x,y,z;
cin>>x>>y>>z;
arr(x,y,z); arr(y,x,z);
}
dfs(,);
rep(i,,)
rep(j,,n)
bz[i][j]=bz[i-][bz[i-][j]];
ll m;
cin>>m;
ll ans=;
ll num=;
rep(i,,m)
{
char cc; ll x;
cin>>cc;
if (cc=='+')
{
cin>>x; num++;
ans+=*sum[x];
it =S.insert(x).first;
if (num==) continue;
bool tt=;
if (it==S.begin())
{
tt=;
it2=nxt(it);
it3=S.end(); it3--;
if (num!=)
{
ans+=*sum[lca(*it2,*it3)];
ans-=*sum[lca(x,*it2)];
ans-=*sum[lca(x,*it3)];
} else ans-=*sum[lca(x,*it2)];
}
it2=nxt(it);
if (!tt&&it2==S.end())
{
tt=;
it2=pre(it);
it3=S.begin();
if (num!=)
{
ans+=*sum[lca(*it2,*it3)];
ans-=*sum[lca(x,*it2)];
ans-=*sum[lca(x,*it3)];
} else ans-=*sum[lca(x,*it2)];
}
if (!tt)
{
it2=pre(it);
it3=nxt(it);
ans+=*sum[lca(*it2,*it3)];
ans-=*sum[lca(x,*it2)];
ans-=*sum[lca(x,*it3)];
}
}
if (cc=='-')
{
cin>>x; num--;
if (!num)
{
ans=; S.clear();
continue;
}
it=S.find(x);
ans-=*sum[x];
bool tt=;
if (it==S.begin())
{
tt=;
it2=nxt(it);
it3=S.end(); it3--;
if (num>=)
{
ans-=*sum[lca(*it2,*it3)];
ans+=*sum[lca(x,*it2)];
ans+=*sum[lca(x,*it3)];
} else ans+=*sum[lca(x,*it3)];
}
it2=nxt(it);
if (!tt&&it2==S.end())
{
tt=;
it2=pre(it);
it3=S.begin();
if (num>=)
{
ans-=*sum[lca(*it2,*it3)];
ans+=*sum[lca(x,*it2)];
ans+=*sum[lca(x,*it3)];
} else ans+=*sum[lca(x,*it3)];
}
if (!tt)
{
it2=pre(it);
it3=nxt(it);
ans-=*sum[lca(*it2,*it3)];
ans+=*sum[lca(x,*it2)];
ans+=*sum[lca(x,*it3)];
}
S.erase(x);
}
if (cc=='?')
{
if (num<=) cout<<<<endl;
else cout<<ans/<<endl;
}
}
return ;
}
异象石(就是sdio宝藏那题)的更多相关文章
- CH#56C 异象石 和 BZOJ3991 [SDOI2015]寻宝游戏
异象石 CH Round #56 - 国庆节欢乐赛 描述 Adera是Microsoft应用商店中的一款解谜游戏. 异象石是进入Adera中异时空的引导物,在Adera的异时空中有一张地图.这张地图上 ...
- [bzoj1912]异象石(set)
Description Adera是Microsoft应用商店中的一款解谜游戏. 异象石是进入Adera中异时空的引导物,在Adera的异时空中有一张地图.这张地图上有N个点,有N-1条双向边把它们连 ...
- Luogu P3320 [SDOI2015]寻宝游戏 / 异象石 【LCA/set】
期末考试结束祭! 在期末考试前最后一发的测试中,异象石作为第二道题目出现QAQ.虽然知道是LCA图论,但还是敲不出来QAQ. 花了两天竞赛课的时间搞懂(逃 异象石(stone.pas/c/cpp)题目 ...
- [LOJ#10132]异象石
Description Adera 是 Microsoft 应用商店中的一款解谜游戏. 异象石是进入 Adera 中异时空的引导物,在 Adera 的异时空中有一张地图.这张地图上 有 N 个点,有 ...
- CH#56C 异象石
一道LCA 原题链接 先跑一边\(dfs\),求出每个节点的时间戳,如果我们将有异象石的节点按时间戳从小到大的顺序排列,累加相邻两节点之间的距离(首尾相邻),会发现总和就是答案的两倍. 于是我们只需要 ...
- 蓝皮书:异象石 【dfs序+lca】
题目详见蓝皮书[算法竞赛:进阶指南]. 题目大意: 就是给你一颗树,然后我们要在上面进行三种操作: 1.标记某个点 或者 2.撤销某个点的标记 以及 3.询问标记点在树上连通所需的最短总边 ...
- LOJ #10132. 「一本通 4.4 例 3」异象石
题目地址 LOJ 题解 神仙思路.思路参考自<算法竞赛进阶指南>. 考虑维护dfs序中相邻两个石头的距离,那么每次?的答案就是sum/2(首尾算相邻) 然后维护一下拿个平衡树/set维护一 ...
- lca:异象石(set+dfs序)
题目:https://loj.ac/problem/10132 #include<bits/stdc++.h> using namespace std; ,N,k=,head[]; str ...
- 洛谷P2447 [SDOI2010]外星千足虫(异或方程组)
题意 题目链接 Sol 异或高斯消元的板子题. bitset优化一下,复杂度\(O(\frac{nm}{32})\) 找最优解可以考虑高斯消元的过程,因为异或的特殊性质,每次向下找的时候找到第一个1然 ...
随机推荐
- IOS应用内嵌cocos2dx游戏项目
1.创建Cocos2d-x项目 相比于Android来说cocos2dx的iPhone环境基本不用配置,直接创建用xcode打开就可以运行. 到Cocos2d-x官方网站下载最新版本引擎. 将刚才下载 ...
- tomcat apr 部署
背景 这还是为了高并发的事,网上说的天花乱坠的,加了apr怎么怎么好,我加了,扯淡.就是吹牛用.我还是认为,性能问题要考设计逻辑和代码解决,这些都是锦上添花的. 步骤 1 windows 部署简单,虽 ...
- $Django Rest Framework-序列化组件
1 序列化组件 e=serializers.SerializerMethodField() # 方法名:叫get_字段名, 参数,返回字典 def get_e(self,obj): #obj为b ...
- kafka组件makemirror处理跨机房业务的应用
业务背景:app分散在不同的idc厂商不同的地域,产生业务数据都向一个kafka中进行处理,这些数据比较分散,如果一时网络抖动或者其他因素,数据就丢失了app --> kafka --> ...
- 解决layui选中项下一页清空问题
项目中遇到给用户在所有产品中匹配一部分产品.用layui 第一页选好之后到第二页再选,等回到第一页时之前选择的都没了,解决这个问题的办法如下: //勾选的产品id集合 var chooseAdids ...
- windows下安装Rabbitmq详解
RabbitMQ是建立在强大的Erlang OTP平台上,因此安装Rabbit MQ的前提是安装Erlang. 1.什么是Erlang? Erlang(['ə:læŋ])是一种通用的面向并发的编程语言 ...
- dubbo常用网址
https://dubbo.gitbooks.io/dubbo-user-book/content/references/protocol/dubbo.html http://dubbo.apache ...
- 02 编程语言、python变量
一 编程语言介绍(***) 1.1机器语言:直接用计算机能理解的二进制指令编写程序,直接控制硬件 优点:执行效率高,跨平台性低 缺点:开发效率低 1.2汇编语言:用英文标签取代二进制指令编写程序,本质 ...
- 帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)
作为一名前端工程师,必须搞懂JS中的prototype.__proto__与constructor属性,相信很多初学者对这些属性存在许多困惑,容易把它们混淆,本文旨在帮助大家理清它们之间的关系并彻底搞 ...
- Confluence 6 协同编辑问题解决
协同编辑是 Synchrony 提供的,用于在编辑的时候实时同步.在一般的情况下,这个进程是不需要 Confluence 的管理员进行手动管理的. 这个页面将会帮助你 Confluence 安装实例中 ...