[AGC041F] Histogram Rooks(神仙题 网格 容斥计数)

[AGC041F] Histogram Rooks

给定一个 \(N\)\(N\) 列的棋盘,第 \(i\) 行只有 \([1,h_i]\) 是有格子的,其他都是虚空。

一个棋子放在一个格子上,我们称一个格子被一个棋子覆盖,仅当这个格子与这个棋子在同一行或同一列,且他们中间没有虚空。特别的,如果这个格子上有棋子,这个格子也被这个棋子覆盖。

求将棋盘上每个格子都覆盖的方案数,对 998244353 取模。

\(1\le h_i\le N\le 400\)

首先有一个最基础的暴力,直接容斥。钦定集合 \(S\) 内的一些格子不被覆盖,其他随意。那么方案数就是 \(2\) 的所有不能覆盖这些格子的数量的幂次,乘上容斥系数 \((-1)^{|S|}\) 累加即可。

观察求方案的过程发现,如果在一行钦定了一个格子不选,则整一行都不能放棋子,而且行是连续的,列是不连续的,不妨将行作为一个整体进行。

枚举选择了格子的集合 \(S\),这里面不能放置棋子。那么取出所有连续的列,计算方案数,再乘起来。

设列的长度为 \(len\),其中有 \(p\) 行在 \(S\) 集合中:

  • 如果在这一列没有选择格子,则都可以放置棋子,方案数 \(2^{len-p}\)
  • 如果在选择了格子,那么整一列不能放置,选择格子的方案数为 \(\sum_{i=1}^p\binom{p}{i}\times(-1)^i=-[p>0]\)

上面式子中由于 \(\sum_{i=1}^p\binom{p}{i}\times (-1)^i\) 是原来暴力容斥中式子的一部分,也可以理解成容斥原理中负的包含一件物品的方案,减去包含两件物品,加上包含三件物品……等于包含所有物品的方案数等于 \(-1\)

但是,仅仅这样判断不能保证 \(S\) 集合中所有的行都能被覆盖到,再进行一波容斥

\(T(T\in S)\) 集合表示在 \(S\) 集合中钦定的不能格子的行,其他随意,容斥系数 \((-1)^{|T|}\)

设列有 \(p\) 个在 \(S\) 集合中,有 \(q\) 个在 \(T\) 集合中:

  • 这一列没有选择格子,方案数 \(2^{len-p}\)
  • 如果选择了格子,选择的方案数为 \(\sum_{i=1}^{p-q}\times(-1)^{i}=-[p>q]\)

这样只用枚举出 \(S\)\(T\) 集合就完成了,但枚举量仍然过于庞大。。

在同一列中,它的方案数为 \(2^{len-p}\) 还是 \(2^{len-p}-1\) 只取决于 \(p\) 是否等于 \(q\),因为 \(p\ge q\)

计算需要减去的贡献,就相当于计算 \([p=q]\) 对应的所有可能的 \((S,T)\)\((-1)^{|T|}\) 的和,但是列之间会有依赖关系,不再独立。

这样依赖的关系很像 SP3734 PERIODNI - Periodni,图都是一样的,将网格剖分成笛卡尔树的形式。

\(dp_{i,j,[p=q]}\) 表示在连续块 \(i\)\(S,T\) 都选择了 \(j\) 行,\(S\) 是否仍然等于 \(T\) 的方案数。

  • 这个连续块中依然保持 \(p=q\),从儿子中 \([p=q]\) 转移过来。
  • 否则,总方案减去上面 \([p=q]\) 的方案数量就是剩余方案数。

在每个连续段中方案数就等于 \(2^{len-p}-[p=q]\) 的长度次幂。

将连续段空行的儿子当做特殊的儿子,上面取就是 \(-1\),不取就是 \(1\)

用树形 DP 完成啦!

#define Maxn 405
#define mod 998244353
int n,tot,All,ans;
int len[Maxn],h[Maxn],siz[Maxn];
int pow2[Maxn][Maxn][2],dp[Maxn][Maxn][2],tmp[Maxn][2];
vector<int> g[Maxn];
inline void init()
{for(int i=0,cur=1;i<=n;i++){pow2[i][0][0]=pow2[i][0][1]=1;for(int j=1;j<=n;j++)pow2[i][j][1]=1ll*cur*pow2[i][j-1][1]%mod,pow2[i][j][0]=1ll*(cur-1+mod)%mod*pow2[i][j-1][0]%mod;cur=cur*2ll%mod;}
}
int build(int l,int r,int cur)
{int minn=inf,num=++All,Last=l-1;for(int i=l;i<=r;i++) minn=min(minn,h[i]);for(int i=l;i<=r;i++)if(h[i]==minn){if(Last+1<=i-1) g[num].pb(build(Last+1,i-1,minn));g[num].pb(0),Last=i;}if(Last<r) g[num].pb(build(Last+1,r,minn));len[num]=minn-cur;return num;
}
void solve(int u)
{if(!u) return;dp[u][0][1]=1;for(int v:g[u]){solve(v);for(int i=0;i<=siz[u]+siz[v];i++) tmp[i][0]=tmp[i][1]=0;for(int su=siz[u];su>=0;su--)for(int sv=siz[v];sv>=0;sv--){ll tall=1ll*(dp[u][su][0]+dp[u][su][1])*(dp[v][sv][0]+dp[v][sv][1])%mod;ll tsame=1ll*dp[u][su][1]*dp[v][sv][1]%mod;tmp[su+sv][0]=(1ll*tmp[su+sv][0]+tall-tsame+mod)%mod;tmp[su+sv][1]=(tmp[su+sv][1]+tsame)%mod;}for(int i=0;i<=siz[u]+siz[v];i++) dp[u][i][0]=tmp[i][0],dp[u][i][1]=tmp[i][1];siz[u]+=siz[v];}for(int i=0;i<=siz[u];i++)dp[u][i][0]=1ll*dp[u][i][0]*pow2[siz[u]-i][len[u]][0]%mod,dp[u][i][1]=1ll*dp[u][i][1]*pow2[siz[u]-i][len[u]][1]%mod;
}
int main()
{n=rd(),init();for(int i=1;i<=n;i++) h[i]=rd();siz[0]=1,dp[0][1][1]=mod-1,dp[0][0][1]=dp[0][1][0]=1;build(1,n,0),solve(1);for(int i=0;i<=n;i++) ans=(1ll*ans+dp[1][i][0]+dp[1][i][1])%mod;printf("%d\n",ans);return 0;
}

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

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

相关文章

程序员修仙之路-数据结构之 CXO让我做一个计算器

菜菜呀&#xff0c;个税最近改革了&#xff0c;我得重新计算你的工资呀&#xff0c;我需要个计算器&#xff0c;你开发一个吧CEO,CTO,CFO于一身的CXOX总&#xff0c;咱不会买一个吗&#xff1f;菜菜那不得花钱吗&#xff0c;一块钱也是钱呀这个计算器支持加减乘除运算就行&…

2021年度训练联盟热身训练赛第一场

2021年度训练联盟热身训练赛第一场 文章目录D.Some Sum题意&#xff1a;题解&#xff1a;代码&#xff1a;F.Pulling Their Weight题意&#xff1a;题解&#xff1a;代码&#xff1a;H On Average Theyre Purple题意&#xff1a;题解&#xff1a;代码&#xff1a;J This Aint Y…

10.17模拟

小题大作&#xff0c;必死无疑 前言 220 6010060 很久没有在CSDN上写总结了 因为这次真的犯了巨大的策略性错误&#xff01; 一句话说就是&#xff1a;要写有得分与时间相比有性价比的东西 考场 先看题 T2无疑是水题 T134相比感觉T3更可作 T1一看直接当成了神仙网络流题 受到…

P5518-[MtOI2019]幽灵乐团【莫比乌斯反演,欧拉反演】

正题 题目链接:https://www.luogu.com.cn/problem/P5518 题目大意 TTT次给出A,B,CA,B,CA,B,C求以下三个式子 ∏i1A∏j1B∏k1Clcm(i,j)gcd(i,k)\prod_{i1}^A\prod_{j1}^B\prod_{k1}^{C}\frac{lcm(i,j)}{gcd(i,k)}i1∏A​j1∏B​k1∏C​gcd(i,k)lcm(i,j)​ ∏i1A∏j1B∏k1C(lcm(…

【2020牛客NOIP赛前集训营-提高组(第二场)】题解(GCD,包含,前缀,移动)

文章目录T1&#xff1a;GCDtitlesolutioncodeT2&#xff1a;包含titlesolutioncode(正解code补充在上面了)T3&#xff1a;前缀titlesolutioncodeT4&#xff1a;移动titlesolutioncodeT1&#xff1a;GCD title solution 非常水&#xff0c;看一眼就知道了 首先我们知道每一个…

.NET Core实战项目之CMS 第十五章 各层联动工作实现增删改查业务

连着两天更新叙述性的文章大家可别以为我转行了&#xff01;哈哈&#xff01;今天就继续讲讲我们的.NET Core实战项目之CMS系统的教程吧&#xff01;这个系列教程拖得太久了&#xff0c;所以今天我就以菜单部分的增删改查为例来讲述下我的项目分层之间的协同工作吧&#xff01;…

Early Orders

题意&#xff1a; 给你一个整数列表 x1&#xff0c;x2&#xff0c;&#xff0c;… &#xff0c;xn 和一个数字 k&#xff0c;它保证从1到 k 的每个 i 至少出现在列表中一次。 现在求一个字典序最小的子序列&#xff0c;子序列有1到k组成 题解&#xff1a; 单调栈求解 我们先…

NOIP2020洛谷P7115:移球游戏(分治)

解析 先考虑n2的情况 可以利用一个空队在不超过5m的操作次数下把两个满队还原 如何推广&#xff1f; 考虑分治 把[l,mid]的球看成同色&#xff0c;[mid1,r]的球看成同色 在左右两两匹配柱子进行n2的还原操作 最后在递归处理 操作次数&#xff1a;5mnlogn 代码 #include<b…

[2020-11-23 contest]图(dfs剪枝),劫富济贫(字典树),小A的树(树形DP),游戏(贪心/斜率优化)

文章目录T1&#xff1a;图solutioncodeT2&#xff1a;劫富济贫solutioncodeT3&#xff1a;小A的树solutioncodeT4&#xff1a;游戏solutioncodeT1&#xff1a;图 【问题描述】 给你一个n个点&#xff0c;m条边的无向图&#xff0c;每个点有一个非负的权值ci&#xff0c;现在你…

P7519-[省选联考 2021 A/B 卷]滚榜【状压dp】

正题 题目链接:https://www.luogu.com.cn/problem/P7519 题目大意 nnn个队伍&#xff0c;队伍之间按照得分从小到大排名&#xff0c;得分相同的按照编号从小到大排。开始时每个队伍有个初始得分aia_iai​&#xff0c;和一个额外分bib_ibi​&#xff0c;主持人会按照bib_ibi​不…

4383 [八省联考 2018] 林克卡特树(WQS 二分+DP)

P4383 [八省联考 2018] 林克卡特树 给定一颗 \(n\) 个点的树&#xff0c;每条边有边权 \(v(|v|\le 10^6)\)&#xff0c;要求删去其中任意 \(k\) 条边&#xff0c;使得剩余联通块的直径之和最大。求出这个最大值。 \(0\le k<n\le 3\times 10^5,10s,1GB\)。 问题是怎么求直径&…

P1742 最小圆覆盖

P1742 最小圆覆盖 题意&#xff1a; 给出N个点&#xff0c;让你画一个最小的包含所有点的圆。 题解&#xff1a; 先说结论&#xff1a; 最优解的圆一定是在以某两个点连线为直径的圆 或者 某三个点组成的三角形的外接圆 初始化将某个圆心定为第一个点&#xff0c;R0 枚举第…

Java实现非对称加密【详解】

Java实现非对称加密 1. 简介2. 非对称加密算法--DH&#xff08;密钥交换&#xff09;3. 非对称加密算法--RSA非对称加密算法--EIGamal5. 总结6 案例6.1 案例16.2 案例26.3 案例3 1. 简介 公开密钥密码学&#xff08;英语&#xff1a;Public-key cryptography&#xff09;也称非…

轻量级.Net Core服务注册工具CodeDi发布啦

为什么做这么一个工具因为我们的系统往往时面向接口编程的,所以在开发Asp .net core项目的时候,一定会有大量大接口及其对应的实现要在ConfigureService注册到ServiceCollection中,传统的做法是加了一个服务,我们就要注册一次(service.AddService()),又比如,当一个接口有多个实…

2020 CSP-S 游记

迟到的游记总述T1&#xff1a;儒略日T2&#xff1a;动物园T3&#xff1a;函数调用T4&#xff1a;贪吃蛇总结总述 可能是有了去年第一次的狂炸经历&#xff0c;很明显的就是在考试策略上的提升 头不铁了&#xff0c;手不残了&#xff0c;心态稳了&#xff0c;分也多了 T1&…

NOIP2018洛谷P5021:修建赛道

没有证明的贪心就是乱搞 解析 把标签写在题面上的一道题… 显然要二分答案然后看能不能分出来m个 关键策略是每个结点内部尽可能的多匹配的前提下&#xff0c;给父亲传一个最大的 这不纪念品分组&#xff1f; 然后我就无脑的敲了个双指针的贪心上去 然后就WA掉了qwq &#xf…

Weird Flecks, But OK

Weird Flecks, But OK 题意&#xff1a; 给出三维坐标中的 n 个点&#xff0c;求一个圆柱的最小直径&#xff0c;该圆柱垂直于坐标平面且能覆盖住所有点 题解&#xff1a; 本人最不擅长计算几何&#xff0c;比赛时没做出来。。。 其实就是将n个点投影到三个坐标平面&#x…

P7516-[省选联考2021A/B卷]图函数【bfs】

正题 题目链接:https://www.luogu.com.cn/problem/P7516 题目大意 懒了&#xff0c;直接抄题意了 对于一张 nnn 个点 mmm 条边的有向图 GGG&#xff08;顶点从 1∼n1 \sim n1∼n 编号&#xff09;&#xff0c;定义函数 f(u,G)f(u, G)f(u,G)&#xff1a; 初始化返回值 cnt0cn…

NOIP2022 游记

开个坑&#xff0c;希望能填上

【.NET Core项目实战-统一认证平台】第十三章 授权篇-如何强制有效令牌过期

上一篇我介绍了JWT的生成验证及流程内容&#xff0c;相信大家也对JWT非常熟悉了&#xff0c;今天将从一个小众的需求出发&#xff0c;介绍如何强制令牌过期的思路和实现过程。.netcore项目实战交流群&#xff08;637326624&#xff09;&#xff0c;有兴趣的朋友可以在群里交流讨…