8.24模拟赛

30 篇文章 0 订阅
17 篇文章 0 订阅

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) ,修改同理,一直向上更新维护即可。
这里写图片描述
但是由于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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值