T1 用个优先(最小值优先)队列维护a【i】+a【j】,如果队顶元素和当前扫到的元素X相等,则同时弹出,否则把X加到a数组中,并把X和之前的a相加后插入到队列里。
时间:
O(N2logN2)
−−−−−−−−−−−−−−−−−−−
T2
在线做法用个主席树即可,裸题。
然后对于S,T,LCA(S,T),LCA(S,T)的父亲分别做一次上述过程,再加加减减搞一下即可。注意离散化时还要记录下标所对应的值,以方便树状数组维护。
−−−−−−−−−−−−−−−−−
T3 50分暴力的做法显然,用一个tr【i】维护i节点为根向下的最大价值链,以及a【i】的值,然后对于一个询问X,一直向上累加链上的值,加上兄弟子树的最长链即可。每次查询都是
O(logN)
,修改同理,一直向上更新维护即可。
但是由于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/