QOJ 9785 Shrooks

news/2025/3/19 21:58:35/文章来源:https://www.cnblogs.com/rizynvu/p/18781843

首先考虑限制的形式:对于两点 \((x_1, y_1), (x_2, y_2)\),要求 \(|x_1 - x_2| + |y_1 - y_2| \le n\)
但是这个式子与 \(x_1, x_2, y_1, y_2\)\(4\) 个值都强相关,且这里的绝对值也并不好拆开处理。
于是考虑让信息相对独立,把曼哈顿距离转化为切比雪夫距离

所以接下来的坐标就变成了 \((x_1 - y_1, x_1 + y_1), (x_2 - y_2, x_2 + y_2)\),限制变成了 \(|(x_1 - y_1) - (x_2 - y_2)|, |(x_1 + y_1) - (x_2 + y_2)|\le n\)
但是看起来还是 \(4\) 个值强相关的形式,所以考虑反面,不满足限制的时候最大差一定 \(> n\),那么只需要保证差最大的一组不超过 \(n\) 就合法
即以 \(i - y_i\) 为例,只需要满足 \(\max\{i - y_i\} - \min\{i - y_i\} \le n\) 就可以满足条件。
但是此时的形式依然涉及到了 \(\max, \min\),但在过程中并不想比较大小怎么办?
继续扩宽限制,只要存在 \(A\) 使得 \(\forall i\in [1, n], A\le i - y_i\le A + n\) 就满足限制。
同理的,只要同时也存在 \(B\) 使得 \(\forall i\in [1, n], B\le i + y_i\le B + n\) 就满足限制。

但是一个问题是 \((A, B)\) 的数量很多依然无法快速的判定,所以接下来考虑限制合法的 \((A, B)\)
首先一个点是因为 \(i, y_i\) 都是整数,所以 \(A, B\) 只取整数就能满足条件。
考虑 \(A\le i - y_i\le A + n\iff -A - n\le i - y_i\le -A\),与 \(B\le i + y_i\le B + n\) 联立可以得到 \(\begin{cases}A + B\le 2i\le A + B + 2n\\ B - A - n\le 2y_i\le B - A + n\end{cases}\)
又因为 \(y_i\) 也是个 \(1\sim n\) 的排列,所以 \(\min\{2i\} = 2, \max\{2i\} = 2n\)\(y\) 同样。
于是把 \(\min, \max\) 都代入式子,可以卡出 \(A + B, B - A\) 的范围:\(A + B\in [0, 2], B - A\in [n, n + 2]\)
于是能发现此时 \(A, B\) 的数量至多有 \(9\) 个(\(A + B, B - A\)\(3\) 种组合起来),且根据 \(n\) 的奇偶关系一些 \(A, B\) 其实并不是整数。

因为刚刚提到了根据 \(n\) 的奇偶不同合法的 \(A, B\) 也不同,所以考虑根据 \(n\) 的奇偶讨论。

首先考虑 \(n\) 为奇数的情况,不妨把 \(n\) 表示为 \(2k + 1\)
那么此时 \((A + B, B - A) = (0, 2k + 2), (2, 2k + 2), (1, 2k + 1), (1, 2k + 3)\)
可以解出 \((A, B) = (-k - 1, k + 1), (-k, k + 2), (-k, k + 1), (-k - 1, k + 2)\)
回到一开始的限制:\(A\le i - y_i\le A + n, B\le i + y_i\le B + n\),可以得到 \(y_i\in [-A - 2k - 1 + i, -A + i]\cap [B - i, B + 2k + 1 - i]\)

那么接下来就可以考虑把 \((A, B)\) 代入得到 \(y_i\) 的区间了,但是看起来对于每个 \(i\) 都要考虑交出来是什么样有点难算了。
一个偷懒的做法是只得到 \(i = 1, i = 2k + 1\) 时的区间,因为如果试着求出来一个 \((A, B)\) 的区间能发现对于前一半的前缀和后一半的后缀,相邻的 \(i, i + 1\)\(y_i\) 范围都满足靠内层的是靠外层的区间左右均扩展一个位置得来的。

  1. \((A, B) = (-k, k + 1)\)
    此时 \(y_i\in [k - 1 + i, k + i]\cap [k + 1 - i, 3k + 2 - i]\)
    于是有 \(y_1\in [k, k + 1], y_{2k + 1} \in [k, k + 1]\),于是 \(y_i\) 形如下图:
    case1
  2. \((A, B) = (-k - 1, k + 2)\)
    此时 \(y_i\in [-k + i, k + 1 + i]\cap [k + 2 - i, 3k + 3 - i]\)
    于是有 \(y_1\in [k + 1, k + 2], y_{2k + 1}\in [k + 1, k + 2]\),于是 \(y_i\) 形如下图:
    case2
  3. \((A, B) = (-k, k + 2)\)
    此时 \(y_i\in [k - 1 + i, k + i]\cap [k + 2 - i, 3k + 3 - i]\)
    于是有 \(y_1\in [k + 1, k + 1], y_{2k + 1} \in [k, k + 2]\),于是 \(y_i\) 形如下图:
    case3
  4. \((A, B) = (-k - 1, k + 1)\)
    此时 \(y_i\in [-k + i, k + 1 + i]\cap [k + 1 - i, 3k + 2 - i]\)
    于是有 \(y_1\in [k, k + 2], y_{2k + 1}\in [k + 1, k + 1]\),于是 \(y_i\) 形如下图:
    case4

乍一看并不好做,但是发现许多能填的位置其实也是不合法的,于是可以考虑类似解数独,从一些独立点开始推导,最后 \(4\) 个情况推导出来形如:
odd_cases

但是注意到有的选取方式可能被计算多次,避免记重所以还要进行一轮容斥。
对于容斥就可以考虑最原始的方式,对于选出来的方案把能放的格子求交算方案数,挨个尝试最后会刚好存在 \(4\) 种需要 \(-1\) 的情况:
odd_-1_cases

接下来考虑偶数的情况,因为过程与奇数大多比较类似,会省略一些过程。

\(n\) 表示为 \(2k\),此时 \((A, B)\)\(5\) 种情况,对应的 \(y_i\) 分别如下:

  1. \((A, B) = (-k, k)\)
    此时 \(y_1\in [k - 1, k + 1], y_{2k} \in [k, k]\)\(y_i\) 如下图:
    case1
  2. \((A, B) = (-k, k + 2)\)
    此时 \(y_1\in [k + 1, k + 1], y_{2k} \in [k, k + 2]\)\(y_i\) 如下图:
    case2
  3. \((A, B) = (-k + 1, k + 1)\)
    此时 \(y_1\in [k, k], y_{2k}\in [k - 1, k + 1]\)\(y_i\) 如下图:
    case3
  4. \((A, B) = (-k - 1, k + 1)\)
    此时 \(y_1\in [k, k + 2], y_{2k}\in [k + 1, k + 1]\)\(y_i\) 如下图:
    case4
  5. \((A, B) = (-k, k + 1)\)
    此时 \(y_1\in [k, k + 1], y_{2k}\in [k + 1, k + 1]\)\(y_i\) 如下图:
    case5

对于容斥的部分,会存在以下 \(2\) 种情况:

  1. \(\{1, 2, 5\}\) 都包含到的情况,容斥系数为 \(-2\)
    case1
  2. \(\{3, 4, 5\}\) 都包含到的情况,容斥系数为 \(-2\)
    case2

一共涉及到的 \(15\) 种情况形式都比较简单,可以直接 \(\mathcal{O}(n)\) 计数,具体细节就不在此讨论了,可以参考代码实现。

于是最后的复杂度为 \(\mathcal{O}(n)\)

#include<bits/stdc++.h>
using ll = long long;
constexpr ll mod = 998244353;
constexpr int maxn = 2e5 + 10;
int n, a[maxn];
inline ll g(int x, int y) { return a[x] == -1 || a[x] == y; }
inline ll calcf(int i, int j, int l, int r, int end_i) {ll ans = 1ll;for (; i <= end_i; i++, j--, l--, r++) {(ans *= g(i, l) * g(j, r) + g(i, r) * g(j, l)) %= mod;}return ans;
}
inline ll calcg(int val, int add) {ll ans = 1;for (int i = 1; i <= n; i++, val = (val + add + n - 1) % n + 1) {ans &= g(i, val);}return ans;
}
inline void solve() {scanf("%d", &n);for (int i = 1; i <= n; i++) scanf("%d", &a[i]);ll ans = 0;if (n % 2 == 1) {int k = n / 2;ll cnt1 = g(k + 1, n) * calcf(1, n, k, k + 1, k);ll cnt2 = g(k + 1, 1) * calcf(1, n, k + 1, k + 2, k);ll cnt3 = g(1, k + 1) * calcf(2, n, k, k + 2, k + 1);ll cnt4 = g(n, k + 1) * calcf(1, n - 1, k, k + 2, k);ll cnt5 = calcg(k + 1, 1);ll cnt6 = calcg(k + 2, 1);ll cnt7 = calcg(k + 1, -1);ll cnt8 = calcg(k, -1);ans = (cnt1 + cnt2 + cnt3 + cnt4 - cnt5 - cnt6 - cnt7 - cnt8 + mod) % mod;} else {int k = n / 2;ll cnt1 = g(k, n) * g(n, k) * calcf(1, n - 1, k - 1, k + 1, k - 1);ll cnt2 = g(k + 1, 1) * g(1, k + 1) * calcf(2, n, k, k + 2, k);ll cnt3 = g(k + 1, n) * g(1, k) * calcf(2, n, k - 1, k + 1, k);ll cnt4 = g(k, 1) * g(n, k + 1) * calcf(1, n - 1, k, k + 2, k - 1);ll cnt5 = calcf(1, n, k, k + 1, k);ll cnt6 = calcg(k + 1, 1);ll cnt7 = calcg(k, -1);ans = (cnt1 + cnt2 + cnt3 + cnt4 + cnt5 - cnt6 * 2 - cnt7 * 2 + mod) % mod;}printf("%lld\n", ans);
}
int main() {int t; scanf("%d", &t);for (int tc = 1; tc <= t; tc++) solve();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/901731.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

golang的GC机制

一、垃圾回收 什么是垃圾回收?垃圾回收(GC,garbage collection)是自动内存管理的一种形式,通常由垃圾收集器收集并适时回收或重用不再被对象占用的内存,比如众所周知的Java语言就能很好的支持GC。后起之秀——Go语言也同样支持垃圾回收,它使得Go程序员在编写程序的时候不…

fastjson漏洞复现(fastjson 1.2.47)

原理: Fastjson 的 @type 字段允许反序列化时动态指定类,攻击者可以通过指定带有危险行为的类,并结合 RMI/LDAP 远程加载恶意类,从而实现命令执行。开启vulhub靶场//如何验证是否存在fastjson反序列化漏洞 有json数据传输的地方可能存在 可以尝试使用dnslog带外但是不知道…

基于神经网络逆同步控制方法的两变频调速电机控制系统matlab仿真

1.课题概述两电机变频调速系统是一个多输入多输出非线性强耦合的控制系统。本课题使用神经网络构造原系统的a阶逆系统,设计线性闭环调节器进行控制,通过matlab对系统进行仿真。对两电机变频调速系统更为精确地实现了张力和速度间的解藕控制。2.系统仿真结果 (完整程序运行后…

使用gradio实现实时语音识别

这里通过gradio来实现实时语音识别,通过上传一个文件,当点击提交后则在右侧输出其相应识别的文字。 实现代码比较简单,如下所示: import gradiodef convert(file_bytes):# 语音识别方法,其中file_bytes是采样率与对应numpy.ndarray实例return recognition_func(file_bytes[1])d…

英语四级跟练计划第一天

前言 今天给英语四级报了名,以我以往英语的水平来看,如果不早早开始复习,绝无通过的可能,走投无路的我只好去向deepseek求助,上一次320分的考生,这一次该付出何等的努力才可以考到425分,如此为我制定了90天的四级复习计划。我相信有很多人和我一样,都被英语四级通过给困…

202107191556 - 层次分析法计算流程

构造矩阵 一致性检验计算最大特征值计算一致性指标CI CI = ( λ - n ) / ( n - 1 )随机一致性指标RI取值计算一致性比率CR计算特征向量列向量归一化 求行和后归一化根据特征向量求最大特征值计算过程

crontab 命令

crontab -l 查看所有任务 crontab -e 编辑任务* * * * * /www/server/php/82/bin/php /www/wwwroot/default/1.php >> /www/wwwroot/default/cron_log.log 2>&1cd /www/wwwroot/www.pk777slots.com/ && php think test在那个目录运行 cd /www/wwwroot/www…

python实验一 20241202王凯

课程:《Python程序设计》 班级: 2412 姓名: 王凯 学号:20241202 实验教师:王志强 实验日期:2025年3月12日 必修/选修: 公选课 1.实验内容 (1)提前了解了一下python,了解它的地位排名,并熟悉Python开发环境;(2)练习Python运行、调试技能;(编写书中的程序,并进行…

2021-PTA模拟题-L2-3 这是二叉搜索树吗?(递归)

递归+二叉搜索树的性质做题历程:拿到手就开始建树,结点太多了所以不能数组建树,就结构体建树,建完发现还得建镜像,就懒得干了,去找大佬们的题解,发现大家都是直接通过二叉搜索树的性质来递归左右子树,一气呵成......还是做题做少了,照葫芦画瓢才过的。。。AcCode: #inc…

2021-PTA总决赛-L2-3 这是二叉搜索树吗?(递归)

递归+二叉搜索树的性质做题历程:拿到手就开始建树,结点太多了所以不能数组建树,就结构体建树,建完发现还得建镜像,就懒得干了,去找大佬们的题解,发现大家都是直接通过二叉搜索树的性质来递归左右子树,一气呵成......还是做题做少了,照葫芦画瓢才过的。。。AcCode: #inc…

Django数据库迁移命令

Django数据库迁移命令 迁移命令 migrate python manage.py migrate # 全部项目 python manage.py migrate AppName # 一个项目 执行迁移命令必须确保当前在项目目录下(执行ls命令能看到 manage.py文件), 然后使用 python manage.py migrate 即可。 如果IDE为pycharm也可以…