异象石(就是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然 ...
随机推荐
- ESXI常用命令
1.简介 VMware vSphere ESXi6.0常用命令使用,对于一些个人认为比较常用的命令进行总结,如果读者需要了解更多请访问VMware官网下载文档,链接如下:https://www.vmw ...
- 题解-hdu2866 Special Prime
Problem hdu-2866 题意:求区间\([2,L]\)有多少素数\(p\)满足\(n^3+pn^2=m^3\),其中\(n,m\)属于任意整数 Solution 原式等价于\(n^2(p+n ...
- 021_supervise进行管理利器
一.公司的类似ansible的工具也是用supervise管理的 [admin@mjyall-test-1 /service/ansible-oc-agent]$ ps -ef|grep 19070 ...
- $Django importlib与dir知识,手写配置文件, 配置查找顺序 drf分页器&drf版本控制
1 importlib与dir知识 # importlib简介动态导入字符串模块 # 常规导入 from ss.aa import b from ss import a print(b,type(b ...
- 关于EditText一些效果
效果如图,由TextView View(竖线) EditText与ImageView组成 首先更改draw able中shape代码 <?xml version="1.0" ...
- 优秀员工的修炼——通往专家、管理之路
(一)好员工的素质 好员工的类型有很多种,尝试着抽象出一个定义吧--好员工是那些主管分配其任务放心.同事喜欢与其共事.对自己工作负责.志在自我提升和价值实现的人.知识经济时代,好员工首先是做好自我管理 ...
- 用于主题检测的临时日志(c5ac07a5-5dab-45d9-8dc2-a3b27be6e507 - 3bfe001a-32de-4114-a6b4-4005b770f6d7)
这是一个未删除的临时日志.请手动删除它.(5051e554-d10d-4e48-b2ca-37c38a30153a - 3bfe001a-32de-4114-a6b4-4005b770f6d7)
- laravel sql复杂语句,原生写法----连表分组
### 使用了临时表.又分组又连表的感觉好难写,使用拉 ravel 但是现在越来也相信,没解决一个新的难题,自己又进步了一点点 ### 原生的sql: select user_code, realna ...
- HTML网页背景图很长要有滚动条滑动
1 前言 由于网页背景图非常长,然后会出现只显示当前页面,后面部分看不到,也不能滑动,开始以为不能滑动应该是没有加overflow-y: auto(scroll),结果加上去也是无效的. 2 代码 & ...
- numpy函数:[1]shape用法
shape函数是numpy.core.fromnumeric中的函数,它的功能是读取矩阵的长度,比如shape[0]就是读取矩阵第一维度的长度.它的输入参数可以使一个整数表示维度,也可以是一个矩阵.