zoukankan      html  css  js  c++  java
  • 省选模拟55

    A. 调兵遣将

      直接做不好做,因为要枚举区间复杂度就已经炸了,所以考虑用总方案数减去不包含当前位置的方案数。

      由于整个序列的gcd种类数只有$nlogw$种,所以可以考虑对于每一种gcd分别考虑。

      对于每一种$gcd=w$,用$(x,l,r)$表示$[l....r,x]$这样的区间满足$gcd=w$,然后考虑dp,令$f_i$表示前i个位置满足条件的方案数。

      那么转移实际上就是区间求和和区间加,直接用线段树可以简单维护。

      于是这样就可以求出来总方案数。

      同理用$g_i$表示$i$到$n$的合法方案数,转移类似。

      然后就可以用$f$和$g$表示不包含当前位置的方案数,发现方案数不同的区间实际上只有不同的区间端点种,所以对于每个区间统一考虑即可。

    B. 一掷千金

      发现这是个经典的翻硬币模型,所以可以对于每个白点分别求出SG值然后异或起来。

      对于每个白点(x,y),打表可以发现SG值是$lowbit(max(x,y))$,所以现在的问题是对于若干矩形的交求出所有这个东西的异或值。

      然后可以想到线段树扫描线,那么剩下的问题就是直接计算一段区间$lowbit$的异或值。

      考虑把线段树的节点长度开成2^k,那么这样的区间的值是容易算的,实际上两两抵消掉了,只剩下区间中点和左端点。

      所以直接上线段树扫描线就没了。

    C. 树拓扑序

      考虑$dp[i][j][k]$表示$i$的子树中$j$的排名为$k$的方案数。

      有了这个东西就可以暴力枚举子树中的点对和排名来统计贡献,预处理一下前缀和可以做到每对点$O(n)$求出。

      然后考虑这个东西的转移,实际上还是枚举一个排名,再枚举前面出现了几个点,类似的转移即可。

  • 相关阅读:
    面向对象三大特性:封装,继承,多态(三、多态的进一步讲解)
    面向对象三大特性:封装,继承,多态(二、多态)
    面向对象三大特性:封装,继承,多态(一,封装和继承)
    zookeeper+dubbo+demo
    Eclipse常见版本和JDK常用版本对应关系
    Navicat 连接MySQL 8.0.11 出现2059错误
    Neo4j elk Elasticsearch kibana kettle
    jvm垃圾回收机制GC
    jvm 这我就能会了 擦
    spring的4种事务特性,4种隔离级别,7种传播行为
  • 原文地址:https://www.cnblogs.com/hzoi-cbx/p/12584500.html
Copyright © 2011-2022 走看看