BZOJ 3730 震波

VictorWonder posted @ 2014年12月06日 12:26 in BZOJ with tags 线段树 树上查询 树分治 解题报告 , 4245 阅读
早上状态完全不在,在有标算的情况下,还是花费了两三个小时才把这道题目做出来。去网上搜了一下,发现好像还没有这道题的题解,出题人自己也没有写详细的题解,所以决定还是写一下题解吧。
这道题目的出题人是Claris(现在好像习惯称呼他为Claris大爷,各种跪烂),他以前也出过一些题目,全都加入到了机房模拟赛之“迈克杯”和“打字比赛”中。我建议他发一些题目到BZOJ上,他说题目太水,都是一眼秒的题目,所以没有上传,直到九月份的某一天,他突然想到了一道题目(就是这题啦),然后花了一个周末的时间弄出了题目、数据和标算,传到了BZOJ上。
中间还发生了一件有趣的事情,当BZOJ上出现这题之后,Claris在纠结自己到底要不要交,Johnson Yip建议他先别交,结果不久后就被Zimpha给AC了,Zimpha表示,这道题目好像和叉姐出的某场模拟赛里面的一道题目差不多。
Claris出完这道题目后,让我猜这道题目的做法,我先是猜树链剖分,他告诉我不是,然后我猜树分治,竟然猜对了,之后Claris就一直怂恿我:“既然你已经知道标算了,就把这道题目给AC了吧……”但是,哪怕知道是树分治,我还是不知道怎么做(主要还是我太弱了),一直拖着。
后来,Claris还专门出了一场"No Wonder Cup"模拟赛,扒了两道题,再加上这题给我们坑,但是我还是没有做出来,直到今天,感觉这题有数据有标算有简略题解,应该能够搞出来,然后就花了一个上午的时间做出了这道题。
 
闲扯扯了几句,下面上题解:
本体标算是点分治,按照Claris的说法,之所以别人的速度比他的快了一倍,是因为别人都用了树状数组,就他用了线段树,我也用了线段树,然后就垫底了,不过,现在也懒得改了,反正AC了就行。
根据点分治的特点,我们可以知道,一个点最多被log n个重心维护,在点分治的时候,我们需要记录一下维护这个结点的所有重心,以及对于一个特定的重心x,结点y在重心x的哪棵子树里面。
接着对于每一个重心,我们维护k+1棵线段树,k是重心x的子树个数,首先,第1棵线段树维护以重心x为根的子树中,与其距离为d的结点的权值和,剩下的k棵线段树分别维护第k棵子树中,到点x距离为d的结点的权值和。
修改的时候,我们需要依次修改维护该结点的log n个重心对应的线段树,以及该结点在这log n个重心中的子树线段树,查询的时候,我们需要查询维护该结点的log n个重心,如果这些重心距离该结点的距离w[k]小于y,那么就再加上这些重心的权值,并且,查询和重心的距离小于等于y-w[k]的所有结点的权值和,但是,这中间有一点小问题。
如图,绿色节点是我们要查询的结点,蓝色结点是其所属的一个重心,我们需要查询与绿色节点的距离差值为2的所有点的权值,也就是和蓝色节点距离差为1的所有结点的权值,但是,我们发现,绿色结点的权值被算了两遍,所以,我们需要减去蓝色节点的所有子树中,绿色结点所在的子树中,和蓝色节点距离差值为1的点的权值。
最后的一点小问题就是,因为我太懒,作死用了vector,导致在本机上测试被卡,不过BZOJ上的表现还是可以的(虽然成功垫底),没有被卡掉。
 
附:
Claris的题解:
My Code:

 

Newnode 说:
2015年1月15日 21:50

倒一被我抢了。。我加了2进制读入才过的。。。

MBOSE Question Paper 说:
2022年8月25日 20:25

Meghalaya Board Model Paper 2023 Class 12 Pdf Download with Answers for Bengali Medium, English Medium, Hindi Medium, Urdu Medium & Students for Small Answers, Long Answer, Very Long Answer Questions, and Essay MBOSE Question Paper Class 12 Type Questions to Term1 & Term2 Exams at official website. New Exam Scheme or Question Pattern for Sammittive Assignment Exams (SA1 & SA2): Very Long Answer (VLA), Long Answer (LA), Small Answer (SA), Very Small Answer (VSA), Single Answer, Multiple Choice and etc.


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter