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

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

  • 相关阅读:
    JDBC
    MySQL 事务
    MySQL 处理海量数据时一些优化查询速度方法
    MySQL 分支和循环结构
    MySQL 分页查询和存储过程
    Oracle PL/SQL异常、存储过程和触发器
    Oracle PL/SQL游标
    mysql主键问题
    spring-springmvc code-based
    AOP实现原理
  • 原文地址:https://www.cnblogs.com/skyh/p/11496789.html
Copyright © 2011-2022 走看看