题解:

之前这道题写过两次题解了吧。。

实现的时候可以用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宝藏那题)的更多相关文章

  1. CH#56C 异象石 和 BZOJ3991 [SDOI2015]寻宝游戏

    异象石 CH Round #56 - 国庆节欢乐赛 描述 Adera是Microsoft应用商店中的一款解谜游戏. 异象石是进入Adera中异时空的引导物,在Adera的异时空中有一张地图.这张地图上 ...

  2. [bzoj1912]异象石(set)

    Description Adera是Microsoft应用商店中的一款解谜游戏. 异象石是进入Adera中异时空的引导物,在Adera的异时空中有一张地图.这张地图上有N个点,有N-1条双向边把它们连 ...

  3. Luogu P3320 [SDOI2015]寻宝游戏 / 异象石 【LCA/set】

    期末考试结束祭! 在期末考试前最后一发的测试中,异象石作为第二道题目出现QAQ.虽然知道是LCA图论,但还是敲不出来QAQ. 花了两天竞赛课的时间搞懂(逃 异象石(stone.pas/c/cpp)题目 ...

  4. [LOJ#10132]异象石

    Description Adera 是 Microsoft 应用商店中的一款解谜游戏. 异象石是进入 Adera 中异时空的引导物,在 Adera 的异时空中有一张地图.这张地图上 有 N 个点,有 ...

  5. CH#56C 异象石

    一道LCA 原题链接 先跑一边\(dfs\),求出每个节点的时间戳,如果我们将有异象石的节点按时间戳从小到大的顺序排列,累加相邻两节点之间的距离(首尾相邻),会发现总和就是答案的两倍. 于是我们只需要 ...

  6. 蓝皮书:异象石 【dfs序+lca】

    题目详见蓝皮书[算法竞赛:进阶指南]. 题目大意: 就是给你一颗树,然后我们要在上面进行三种操作:  1.标记某个点  或者  2.撤销某个点的标记  以及   3.询问标记点在树上连通所需的最短总边 ...

  7. LOJ #10132. 「一本通 4.4 例 3」异象石

    题目地址 LOJ 题解 神仙思路.思路参考自<算法竞赛进阶指南>. 考虑维护dfs序中相邻两个石头的距离,那么每次?的答案就是sum/2(首尾算相邻) 然后维护一下拿个平衡树/set维护一 ...

  8. lca:异象石(set+dfs序)

    题目:https://loj.ac/problem/10132 #include<bits/stdc++.h> using namespace std; ,N,k=,head[]; str ...

  9. 洛谷P2447 [SDOI2010]外星千足虫(异或方程组)

    题意 题目链接 Sol 异或高斯消元的板子题. bitset优化一下,复杂度\(O(\frac{nm}{32})\) 找最优解可以考虑高斯消元的过程,因为异或的特殊性质,每次向下找的时候找到第一个1然 ...

随机推荐

  1. 18春季训练01-3/11 2015 ACM Amman Collegiate Programming Contest

    Solved A Gym 100712A Who Is The Winner Solved B Gym 100712B Rock-Paper-Scissors Solved C Gym 100712C ...

  2. redhat yum

    背景 这个redhat可让我好一顿折腾,对于这个yum的安装,如果成功则罢,不成功可有的收拾的.还是centos比较好啊. 转载 1 下载下面四个软件包(可以从163下载,版本号自己搜索) wget ...

  3. jar运行

    #在.bat文件中,输入下面两行代码,双击运行该bat文件即可将带main方法的jar跑起来 title NAME java -jar NAME.jar #当web项目打包成war后,部署到tomca ...

  4. win10:在关闭防火墙下如何屏蔽特定端口

    如果win10没有组策略,请参考:https://www.cnblogs.com/huiy/p/9291392.html 在"开始"菜单选择"运行",输入&qu ...

  5. git命令(版本控制之道读书笔记)

    1.在Windows中安装完git后,需要进行一下配置:$ git config --global user.name "zhangliang"$ git config --glo ...

  6. 12)django-ORM(单表返回数据3种方式)

    单表查询还回数据有3种形式,返回形式不一样,模板调用方式不同 1)返回Queryset里面内容为对象:Business.objects.all() 这里内容显示是对象 2)返回Queryset里面内容 ...

  7. Swift可选项

  8. 如何在cmd中安装python第三方模块

    打开 cmd终端 1 输入pip  install   模块名. 2 等待安装完成即可.

  9. asynicio模块以及爬虫应用asynicio模块(高性能爬虫)

    一.背景知识 爬虫的本质就是一个socket客户端与服务端的通信过程,如果我们有多个url待爬取,只用一个线程且采用串行的方式执行,那只能等待爬取一个结束后才能继续下一个,效率会非常低. 需要强调的是 ...

  10. 基于BootStrap的Collapse折叠(包含回显展开折叠的对应状态)

    情况描述:为了改善页面上的input框太多,采用∧∨折叠展开,这个小东西来控制,第一次做,记录一下ヾ(◍°∇°◍)ノ゙下边是Code 代码: //html代码 <div id="col ...