-
A
题意:
题解:
模拟
代码:A -
B
题意:
在平面第一象限中原有n个a点,同时按顺序出现m个b点,每出现一个b点以其位置为中心,向x,y轴垂直画射线,若射线碰到之前其他b点画的线则停止.问每个b点出现时其画的射线与坐标轴、其他b点画出的射线围成的闭区域中有多少个a点.
b点所有x坐标互不相同,所有y坐标互不相同.
题解:
考虑离线做法,先求出所有b点都画完之后每个b点所属区域中有多少个a点,然后按出现顺序逆序删除b点及其所属线段,其所属的点就累加到其他b点所属的区域中.
用类似扫描线算法实现,先对所有a,b点y坐标从大到小排序,以此将点加入,同时维护一个按x坐标升序排序的b点集合,其中所有点垂直的射线都没有被其他b点的水平射线挡住.
对于每一个给定的y坐标,由于只有可能出现一个b点,先对b点操作再对a点操作.
考虑:
(1)如何将b点加入集合并维护集合正确性
(2)找出如果将b点删除后,其中的答案应累加给谁.
(3)找出a点在最终图中所属的b点
对于(1),直接将当前b点加入集合,在集合中直接查找x坐标,然后将x坐标小于当前点且在原题目中出现时间晚于当前点的点删除,由于点只能被删除一次,这部分复杂度logn;
对于(2),找到集合中当前b点在集合中的下一个点,即为所求.无需比较在原题目中出现时间的先后顺序(使用并查集合并正确性显然).
对于(3),找到在b集合中x坐标大于等于这一a点的第一个点即可.
统计答案时,按原题目中出现顺序从后往前操作,先记下在并查集中当前点的累加答案,再将这个点答案与之前(2)步骤中找出的点用并查集合并在一起.
代码:B
-
G
题意:
有一个n点m边的双向图(n,m<=3e5),初始时一个人在1点,他每次能花费1代价获得一次转移机会,这次机会可以让他等概率走到当前点的相邻点,同时他可以选择不移动(但依然花费代价),求到n点的最小期望值.
题解:
设f(x)为点x到n的最小期望,初始时只知道f(n)=0.
考虑从小到大将所有f(x)求出来.
现在假设已知前k小的f(x).
对于第k+1小的点,他在花费1代价后,如果随机到前k小的点,则向前走,否则就停留原地.
设cnt(x)为x的相邻点中已知f(x)的个数,d(x)为x的度数.
那么对于第k+1个点,肯定满足
f(x)=Σf(i)/d(x)(f(i)已知)+f(x)*(d(x)-cnt(x))/d(x)+1
整理得显含f(x)的表达式.
根据这个表达式求得的最小值的那个点即为第k+1个点.
运用类似dijstra做法即可
代码:G -
L
题意:
2000x2000网格平面中有a,b两种正方形,a边与网格线水平,b边与网格线呈45°夹角,两种正方形中心都在格点上,且a的边长为偶数,b的对角线长为偶数,求所有正方形面积并.
题解:
考虑将a,b两种正方形分开处理.
对于a,用二维前缀和计算每个格点是否被覆盖即可.
对于b,作出一个与所有b边平行的新网格图,用处理a一样的方法进行处理,同时计算新图到原图中的映射.
统计答案时遍历新图中每一个点,同时找出在原图中的对应区域是否被覆盖,运用简单容斥即可.
注意细节及边界情况
代码:L