模拟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行,考场上没有过样例,线段树上疯狂找到已经有花精的位置,死也没调出来。

第二天发现是线段树懒标记下传后没有清空,别的都是对的。

posted @ 2019-09-10 12:15  skyh  阅读(151)  评论(0编辑  收藏  举报