模拟41 题解
A. 夜莺与玫瑰
与题解中的定义类似:
枚举每个斜率,设为向量$(a,b)$
如果$gcd(a,b)!=1$,那么直接跳过。
考虑每个点(x,y),它的前趋为(x-a,y-b),后继为(x+a,y+b)。
一个点是合法的当且仅当不存在前趋,存在后继。
于是$ans=\sum \limits_{i=1}^{n-1} \sum \limits_{j=1}^{m-1}[gcd(i,j)==1]*(min(i,n-i)*(m-j)+min(j,m-j)*(n-i)-min(i,n-i)*min(j,m-j))$
这个比较显然的式子的出来之后,预处理出gcd数组就可以$O(nm)$回答了。
然后发现取min不好处理,尝试把它化开。
设$n-i<=i$,也就是$i*2>=n$,
然后式子被化成了$(n-i)*(m-j)=nm-im-jn+ij$,这个是可以很简单的用前缀和处理的。
当m与j符合上述关系是类似的。
设$n-i>i$且$m-j>j$,
式子也可以推出比较好的形式$im+jn-3*ij$,同理前缀和处理。
然而需要至少三个前缀和数组,根本开不下。
所以离线询问,将一个数组当三个用(???)。
然后就成功不打正解过了这道题。
B. 影子
该题的问题大概在于:
min值不方便维护,按照常规思路,考虑过一个点的两条链,无法判定二元组$(min_d,sum_w)$的优先级。
正解的处理方法是排序:
因为一个点一定只能延伸出两条链,每种方案一定可以被min值小的链查找min值大的链表示出来。
所以按min值排序,只维护sum值最大,尝试更新答案即可。
至于复杂度,点分治可以保证$O(nlog^2n)$,瓶颈在于排序。
另一个问题:点分治过程中如何处理来自同一棵子树的不合法的两条链,防止并在一起。
我打麻烦了,用了一棵线段树,下标为第几棵子树,维护最大值,使用区间查询。
其实维护最大值和次大值就可以了,同时保证最大值和次大值不在同一棵子树。
C. 玫瑰花精
难道常规的思路不应该是:
使用一个set维护每个花精的位置,以找到前驱后继。
同时维护一棵线段树,该线段树需要支持四个操作:
区间赋值,
区间赋值为单增的等差数列,
区间赋值为单减的等差数列,
区间查询最大值。
新花精插入时直接找最大值插入,同时找前驱后继调用操作2 3,
新花精退出时同理找前驱后继调用操作2 3,
操作1则是为了特判区间中一个花精都没有的情况。
然而打的很恶心,主要是三个懒标记的维护。
打了180行,考场上没有过样例,线段树上疯狂找到已经有花精的位置,死也没调出来。
第二天发现是线段树懒标记下传后没有清空,别的都是对的。