2021-11-NOIP模拟赛总结
1.时间安排
T1:8:50—9:57
如果直接找的话O(n2)直接就炸了,没写这档暴力,
考虑面积得出方式,同行选一个点,同列选一个点,计算距离之后相乘,那么假如同行选一个,同列全选,也是可以计算的,处理所有点到该点的距离之和即可(即sumx),sumx处理完之后是一个不变量,相当于底,找三角形的高再求一次sum就行了,
但是预处理的话也有可能会炸(最差n2),那么坐标该怎么求呢?
首先按照x第一关键字,y第二关键字排序,依次放入对应下标的vector里(不离散化,并不会炸,vector并没有初始内存,我已知的只有queue有),可以保证vector里元素单调不下降(伏笔).放入元素同时将在当前元素之前的元素的sum作为第二维(second)一同放入,同一行或一列的所有元素的sum放入sumx(x作为下标)或sumy(y作为下标)中(可看下图理解).
求同一列或同一行的sum时,先二分出当前元素在vector中的位置id,然后就能算出比当前元素不小的元素个数(因为要减去当前点的影响),等于vector.size()(元素个数)-id(当前元素是第k小的话,id=k-1,因为最小的元素id为0),比当前元素小的元素数量则为id,计算比当前元素不小的元素的sum(sumx\sumy-vx\vy[id].second,见伏笔),然后该点能够产生的面积总和就是
s u m a l l − v [ i d ] . s e c o n d − ( v . s i z e ( ) − i d ) ∗ v a l n o w + i d ∗ v a l n o w − v [ i d ] . s e c o n d sumall - v[id].second - (v.size() - id) * valnow + id * valnow - v[id].second sumall−v[id].second−(v.size()</