首页 > 其他分享 >LOJ #3353. 「CEOI2020」象棋世界

LOJ #3353. 「CEOI2020」象棋世界

时间:2023-12-11 20:11:25浏览次数:35  
标签:方案 终点 log LOJ Section CEOI2020 3353 步数 翻转

题面传送门

什么缝合怪(

以下默认判掉一步走到。

Section 1: P

容易发现不会改变纵坐标,简单判断即可。

Section 2: R

两步,两种方案。

Section 3: Q

因为 \(n\geq m\),所以直走两种方案,先斜着走再竖着走两种方案是一定有的。

以下默认其先往左下走,往右下走翻转再做一遍就好了。

如果上面的点在 \(m\) 处且 \(n=m\),则可以先走对角线走到 \((n,1)\),然后横着走走到终点。

如果黑白染色一样且不越界,则可以走两步斜着走到终点。

Section 4: B

特判黑白染色不一致的情况

枚举起点第一步往哪里走,终点最后一步往哪个方向走,则步数,以及路线的形状已经确定了。

现在有一个问题在于,路线不一定能经过终点,这时需要将某一些转弯的地方不要碰到边界再转,而是提前 \(x\) 步转,这样能对终点造成 \(2x\) 的偏差。

计算出需要提前的部署,然后组合数计算方案数即可。

你等会,如果有些转弯的地方不足 \(x\) 步,但是你给它分配了减少 \(x\) 步,那怎么办?

但是你会发现,如果出现这种情况,说明步数可以减少,则不会计算到最终的答案中,因此是正确的。时间复杂度 \(O(C)-O(1)\),我偷懒写了个 \(O(1)-O(C\log p)\) 的(

Section 5: K

因为 \(n\geq m\),所以步数为 \(n-1\),然后问题相当于,从 \(r_1\) 开始,每次可以走到 \(x-1,x,x+1\) 三个地方,要求不能跑出 \([1,m]\),求最后走到 \(r_c\) 的方案数。

考虑反射容斥的 DP 形式:将 \([1,m]\) 翻转赋值一份放到 \([m+2,2m+1]\),并将系数变成 \(-1\),并规定 \(2m+1\) 右边是 \(0\),则初始设 \(r_1\) 处为 \(1\),翻转处为 \(-1\),则走 \(n-1\) 步就是方案数。因为在 \(0\) 处和 \(m+1\) 处两个值之间会相互抵消。

在预处理的时候对这个循环序列做快速幂,即可做到 \(O(C^2\log n)-O(C)\),实现的好可以做到 \(O(C\log C\log n)-O(1)\) 不过我懒(

submission

标签:方案,终点,log,LOJ,Section,CEOI2020,3353,步数,翻转
From: https://www.cnblogs.com/275307894a/p/17895456.html

相关文章

  • LOJ6039 「雅礼集训 2017 Day5」珠宝
    LOJ传送门显然枚举物品做背包没有前途,于是我们把体积相等的物品捆绑在一起。设\(f_{i,j}\)为考虑完体积\(\in[1,i]\)的物品,背包容量为\(j\)的最大值。可以贪心求出\(g_{i,j}\)为选\(j\)个体积为\(i\)的物品的价值最大值。分\(j\bmodi\)的余数转移,发现可以......
  • 0x05.HelloJAVA
    基础知识java的类目和文件名必须相同(区分大小写)java文件,先编译成字节码(.class文件),然后在JAVA的虚拟机JVM上以解释方式执行字节码java的项目里面包含了源代码、依赖、配置文件,会直接打包,生成编译后的项目java的包,com.aaa.bbb相当于三个文件夹"."可以理解成/属于某......
  • loj144&145 dfs序+树状数组/线段树
    https://loj.ac/p/144https://loj.ac/p/145两题非常相似,一题的权值修改是在点上的,一题的权值修改是在整棵子树上的。首先我们要了解dfs序,并记录每个节点的子树大小sz,对于一个节点,在dfs序上sz长的区间全都是他的子节点以及他自己。所以我们将一棵树映射到了一个区间上,并且可......
  • 题解 LOJ3483【[USACO21FEB] Counting Graphs P】
    题解P7418【[USACO21FEB]CountingGraphsP】problemBessie有一个连通无向图\(G\)。\(G\)有\(N\)个编号为\(1\ldotsN\)的结点,以及\(M\)条边(\(1\leN\le10^2,N-1\leM\le\frac{N^2+N}{2}\))。\(G\)有可能包含自环(一个结点连到自身的边),但不包含重边(连接同一对结点......
  • 无涯教程-Clojure - Desktop – Displaying Labels函数
    可以在标签类的帮助下显示标签。以下程序显示了有关如何使用它的示例。(nsweb.core(:gen-class)(:require[seesaw.core:asseesaw]))(defn-main[&args](defndisplay[content](let[window(seesaw/frame:title"Example")](->win......
  • 无涯教程-Clojure - Desktop – See-saw函数
    跷跷板是一个可用于创建桌面应用程序的库。为了使用跷跷板,请首先从以下github链接下载.clj文件:https://github.com/daveray/seesaw然后创建一个示例桌面应用程序。以下是相同的代码。(nsweb.core(:gen-class)(:require[seesaw.core:asseesaw]))(defwindow(see......
  • 无涯教程-Clojure - commute函数
    通勤还用于更改引用类型的值,就像alter和ref-set一样,唯一的区别是,这也需要放在"dosync"块中。commute-语法(commuterefnamefun)参数   -'refname'是保存参考值的变量的名称。"fun"是用于更改引用类型的值的函数。返回值 -引用及其相应的新值。commute-示例......
  • 无涯教程-Clojure - alter函数
    此函数用于安全地更改引用类型的值,它在线程中运行,该线程不能被另一个进程访问,这就是为什么该命令始终需要与"dosync"方法相关联的原因。其次,要更改引用类型的值,需要调用一个函数以对该值进行必要的更改。alter-语法(alterrefnamefun)参数   - 'refname'是保存参......
  • 无涯教程-Clojure - dosync函数
    在包含表达式和任何嵌套调用的事务中运行表达式,如果没有任何线程在该线程上运行,则启动事务,任何未捕获的异常都将中止事务,并退出dosync。dosync-语法(dosyncexpression)参数   - "expression"是一组表达式,将出现在dosync块中。返回值 -无。dosync-示例以下......
  • 无涯教程-Clojure - ref函数
    这用于创建参考值。创建参考值时,有一个提供验证器函数的选项,该函数将验证创建的值。ref-语法(refxoptions)参数   - "x"是需要提供给参考的值,"options"是可以提供的一组选项。返回值- 引用及其对应的值。ref-示例以下程序显示了有关如何使用它的示例。(......