T1 用个优先(最小值优先)队列维护a【i】+a【j】,如果队顶元素和当前扫到的元素X相等,则同时弹出,否则把X加到a数组中,并把X和之前的a相加后插入到队列里。
时间:O(N2logN2)

T2  在线做法用个主席树即可,裸题。
     然而可以用离线+树状数组水过。将一个询问分解为子问题,求根节点到当前节点的数内,在【L,R】内的数的和,用个树状数组维护即可,dfs到一个点时,插入,退出时,删除。
    然后对于S,T,LCA(S,T),LCA(S,T)的父亲分别做一次上述过程,再加加减减搞一下即可。注意离散化时还要记录下标所对应的值,以方便树状数组维护。

T3 50分暴力的做法显然,用一个tr【i】维护i节点为根向下的最大价值链,以及a【i】的值,然后对于一个询问X,一直向上累加链上的值,加上兄弟子树的最长链即可。每次查询都是OlogN),修改同理,一直向上更新维护即可。
8.24模拟赛
但是由于N比较大,许多节点的值事实上没有发生过更改,因此可以把tr,a换为map,只有发生过更改才记录下来。
对于点X,计算最大价值链时,
1)修改过,tr里有记录,就可以直接返回;
2)子树内都没有修改过,这时,往左右两边一直跳至L,R,设最大深度分别为l,r,若l!=r说明子树内最大数为N,否则为R,然后从子树内最大值往上跳至X即可。

对于点X,计算该点的值时,
1)修改过,a里有记录,直接返回;
2)没修改过,返回X。

然后其他基本都和暴力的想法差不多。
有个小细节,母鸡为何map在查询一个下标时,比如tr是一个map,然后对于一个下标X,用tr【x】!=0和用tr.count(x),前者貌似会往tr里加入一个元素。原来只要用后面的方法访问下标后会直接创建,一脸蒙蔽,不明觉厉……SO一开始被搞得MLE。
另:这题在读入输出优化的BUFF下才愉快AC,inline加了反而T掉是smg……

T3暴力:http://paste.ubuntu.com/25423822/
可以拿来和正解对比一下~~~
AC代码:
T1:http://paste.ubuntu.com/25423816/
T2:http://paste.ubuntu.com/25423817/
T3:http://paste.ubuntu.com/25423818/

相关文章:

  • 2021-07-06
  • 2021-12-28
  • 2021-12-15
  • 2021-06-15
  • 2021-04-02
  • 2021-08-12
  • 2021-12-25
  • 2021-05-27
猜你喜欢
  • 2021-12-13
  • 2022-03-06
  • 2021-08-28
  • 2021-08-19
  • 2022-12-23
  • 2021-04-18
相关资源
相似解决方案