【十二省联考2019】皮配【分部dp】

题意:有 nnn 个学校隶属于 ccc 个城市,每个学校有 sis_isi 个人。把它们放入一个 2×22\times 22×2 的格子中,要求同一学校的必须放在同一个格子,同一城市的必须放在同一行,并给出两行两列分别最多能放的人数C0,C1,D0,D1C_0,C_1,D_0,D_1C0,C1,D0,D1。此外还有 kkk 条限制,形如某个学校的人不能放入某个特定的格子中,每个学校最多只有一种限制。求方案数 模 998244353998244353998244353

n,c≤103,C0,C1,D0,D1≤2500,k≤30,si≤10n,c\leq 10^3,C_0,C_1,D_0,D_1\leq 2500,k\leq 30,s_i\leq 10n,c103,C0,C1,D0,D12500,k30,si10,数据组数 T=5T=5T=5

首先考虑暴力 dp,发现确定第一行、第一列后完整方案就确定了。所以可以设 f(x,y)f(x,y)f(x,y) 表示第一行放了 xxx 个数,第一列放了 yyy 个数,直接转移即可。计算答案时 xxxyyy 的上下界都可以确定出来,这样就有 50pts 的好成绩。

然后发现对于没有限制的情况,行和列是分别独立的,所以分别设 A(x),B(x)A(x),B(x)A(x),B(x) 为第一行、第一列选了 xxx 个的方案数,前者用城市总人数转移,后者用学校人数转移,然后乘起来就可以了。单独写就有 50pts,结合前面可以拿到 70pts。

考虑这个方法不好扩展,但发现有限制的城市不超过 kkk 个,所以可以从“降低了数据范围的方向”来考虑。

开始想的是 dp 的时候记录两列受限制的人数,然而状态数爆炸。

发现城市数很少并没什么用,因为一个城市里面即使只有一个受限制的学校,你整个城市都只能大暴力,


智商分割线


我们称一个城市受限当且仅当至少一个该城市的学校受限。考虑继续挖掘受限的城市中不受限的学校的性质。

冷静分析可以发现,对于一个受限的城市,确定了受限的学校选择了哪一行后,不受限的学校选哪一行就确定了,只需要决定选哪一列然后根据最终方案随机应变就可以了。也就是说这部分拿去更新 B(x)B(x)B(x) 就可以不管了。

对于最终受限的学校只有 303030 个,直接用第一个方法大暴力就可以了。要注意的是需要先决定每一个城市选了哪一行,可以对每个城市把状态分为两部分,分别为选择第一行和第二行的 dp 值。然后把两部分直接加起来,在这里把第一行该城市的人数减掉。

注意 dp 顺序,必须依次枚举城市更新所有信息,否则会算重。

然后把这个暴力 dp 求二维前缀和,枚举前面的 A(x),B(x)A(x),B(x)A(x),B(x) 算贡献即可。

显然复杂度瓶颈在第三步,复杂度为 O(kM2)O(kM^2)O(kM2),非常卡。

注意到这个 dp 是从头开始算的,第二维不会超过 ksiks_iksi,就可以优化到 O(k2siM)O(k^2s_iM)O(k2siM)

总复杂度 O(TM(N+k2si))O(TM(N+k^2s_i))O(TM(N+k2si))

有点卡常,不过不用 memset 应该问题不大

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <vector>
#define re register
using namespace std;
typedef long long ll;
const int MOD=998244353;
inline int mod(int x){return x+=(x>>31)&MOD;}
inline int add(const int& x,const int& y){return mod(x+y-MOD);}
inline int dec(const int& x,const int& y){return mod(x-y);}
inline int read()
{int ans=0;char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return ans;
}
vector<int> lis[1005],fr,hfr;
int n,c,k,C[2],D[2],b[1005],s[1005],p[1005],cnt[1005],M;
int A[2505],B[2505],g[2505],f[2505][2505],t0[2505][2505],t1[2505][2505],tmp0[2505][2505],tmp1[2505][2505],siz[1005];
inline void clear()
{for (int i=1;i<=c;i++) lis[i].clear();memset(p,-1,sizeof(p));memset(cnt,0,sizeof(cnt));fr.clear(),hfr.clear();memset(A,0,sizeof(A));memset(B,0,sizeof(B));memset(g,0,sizeof(g));memset(f,0,sizeof(f));memset(siz,0,sizeof(siz));A[0]=B[0]=g[0]=f[0][0]=1;
}
int main()
{freopen("test.in","r",stdin);for (int T=read();T;T--){n=read(),c=read(),C[0]=read(),C[1]=read(),D[0]=read(),D[1]=read();M=max(max(C[0],C[1]),max(D[0],D[1]));clear();int tot=0;for (int i=1;i<=n;i++) b[i]=read(),s[i]=read(),siz[b[i]]+=s[i],tot+=s[i];k=read();int MAX=min(M,k*10);while (k--){int i=read();p[i]=read();++cnt[b[i]];}if (C[0]+C[1]<tot||D[0]+D[1]<tot) {puts("0");continue;}for (int i=1;i<=n;i++)if (!cnt[b[i]]) fr.push_back(i);else if (p[i]==-1) hfr.push_back(i);else lis[b[i]].push_back(i);for (int i=1;i<=c;i++)if (!cnt[i]&&siz[i])for (int j=M;j>=siz[i];j--)A[j]=add(A[j],A[j-siz[i]]);for (int i=0;i<(int)fr.size();i++){int v=s[fr[i]];for (int j=M;j>=v;j--) B[j]=add(B[j],B[j-v]);}for (int i=0;i<(int)hfr.size();i++){int v=s[hfr[i]];for (int j=M;j>=v;j--) B[j]=add(B[j],B[j-v]);}for (re int i=1;i<=c;i++){if (!cnt[i]) continue;for (re int j=0;j<=M;j++)for (re int k=0;k<=MAX;k++)t0[j][k]=t1[j][k]=f[j][k];for (re int l=0;l<cnt[i];l++){re int v=s[lis[i][l]],lim=p[lis[i][l]];for (re int j=0;j<=M;j++)for (re int k=0;k<=MAX;k++)tmp0[j][k]=tmp1[j][k]=0;for (re int j=0;j<=M;j++)for (re int k=0;k<=MAX;k++){if (lim!=0&&k>=v) tmp0[j][k]=add(tmp0[j][k],t0[j][k-v]);if (lim!=1) tmp0[j][k]=add(tmp0[j][k],t0[j][k]);if (lim!=2&&k>=v) tmp1[j][k]=add(tmp1[j][k],t1[j][k-v]);if (lim!=3) tmp1[j][k]=add(tmp1[j][k],t1[j][k]);}for (re int j=0;j<=M;j++)for (re int k=0;k<=MAX;k++)t0[j][k]=tmp0[j][k],t1[j][k]=tmp1[j][k];	}for (int j=0;j<=M;j++)for (int k=0;k<=MAX;k++)f[j][k]=add(j>=siz[i]? t0[j-siz[i]][k]:0,t1[j][k]);}for (int i=0;i<=M;i++)for (int j=0;j<=M;j++){if (i) f[i][j]=add(f[i][j],f[i-1][j]);if (j) f[i][j]=add(f[i][j],f[i][j-1]);if (i&&j) f[i][j]=dec(f[i][j],f[i-1][j-1]);}int res=0;for (int i=0;i<=C[0];i++)for (int j=0;j<=D[0];j++){if (!A[i]||!B[j]) continue;int xl=max(0,tot-C[1]-i),xr=C[0]-i;int yl=max(0,tot-D[1]-j),yr=D[0]-j;int ans=f[xr][yr];if (xl) ans=dec(ans,f[xl-1][yr]);if (yl) ans=dec(ans,f[xr][yl-1]);if (xl&&yl) ans=add(ans,f[xl-1][yl-1]);res=(res+(ll)ans*A[i]%MOD*B[j])%MOD;}printf("%d\n",res);}return 0;
}

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

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

相关文章

Codeforces Round #590 (Div. 3) F. Yet Another Substring Reverse 子集dp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 之前做过类似的题&#xff0c;翻转一个字串相当于将任意两个不相交的串连在一起。再一看字符集≤20\le20≤20&#xff0c;那就是铁子集dpdpdp了。 定义f[i]f[i]f[i]表示状态为iii的串的长度…

一个超轻量级工作流引擎:Workflow-Core

近期工作上有一个工作流的开发需求&#xff0c;自己基于面向对象和职责链模式捣鼓了一套小框架&#xff0c;后来在github上发现一个轻量级的工作流引擎轮子&#xff1a;Workflow-Core&#xff0c;看完其wiki之后决定放弃之前自己造的轮子&#xff0c;使用这个开源项目来改造&am…

Codeforces Round #590 (Div. 3) E. Special Permutations 差分 + 思维

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 直接考虑比较难想&#xff0c;这种公式题基本都是将部分答案看成一个整体&#xff0c;考虑xi,xi1x_i,x_{i1}xi​,xi1​的贡献的。 假设当前的xix,xi1y,x<yx_ix,x_{i1}y,x<yxi​x,xi1…

【THUSC 2017】如果奇迹有颜色【polya引理】【矩阵】【计数dp】【BM打表+线性递推】

题意&#xff1a;长度为 nnn 的环染 mmm 种颜色&#xff0c;要求任意相邻 mmm 个元素不能包含全部的颜色。求方案数 模 109710^971097&#xff0c;循环同构。 n≤109,m≤7n\leq 10^9,m\leq7n≤109,m≤7 为啥我现在天天都在打表啊 先上 polya&#xff0c;对于移动 iii 位的置换…

ASP.NET Core 3.0中支持AI的生物识别安全

本文共两个部分&#xff0c;这是第一部分&#xff0c;其中介绍了 ASP.NET Core 3 中旨在将授权逻辑与基本的用户角色相分离的基于策略的授权模型。此部分提供了此授权进程的基于生物识别信息&#xff08;如人脸识别或语音识别&#xff09;的具体示例。在此示例中&#xff0c;检…

Codeforces Round #588 (Div. 2) D. Marcin and Training Camp 思维

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 有nnn个人&#xff0c;每个人都有一个能力值bib_ibi​以及他会的技能aia_iai​&#xff0c;当他会第xxx个技能的时候&#xff0c;aia_iai​的第xxx位是111。定义当xxx不会某个技能但是yyy会的时候&#xff0…

架构杂谈《五》

保证最终一致性的模式在大规模、高并发服务化系统中&#xff0c;一个功能被拆分成多个具有功能单一的子功能&#xff0c;一个流程会有多个系统的多个单一功能的服务组合实现&#xff0c;如果使用两阶段提交协议和三阶段提交协议&#xff0c;确实能解决系统间的一致性问题。其实…

【ROI 2019 Day2】课桌【贪心】【决策单调性】【分治】

题意&#xff1a;有 mmm 个班&#xff0c;每个班有 2n2n2n 个人&#xff0c;他们的身高给定。有 kkk 种双人桌&#xff0c;每张桌子有两个属性值 Li,RiL_i,R_iLi​,Ri​,一个身高为 hhh 的人坐第 iii 种桌子的不舒适度为 hhh 到区间 [Li,Ri][L_i,R_i][Li​,Ri​] 的最小距离。你…

Codeforces Round #588 (Div. 2) E. Kamil and Making a Stream 数学 + 暴力

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一颗树&#xff0c;其中根是111&#xff0c;每个点有一个点权&#xff0c;求每个点到根的所有路径的gcdgcdgcd之和。 n≤1e5n\le1e5n≤1e5 思路&#xff1a; 一看到以为是个点分治&#xff0c;让后发现…

【NOIP模拟】彩色树【树形dp】【树链剖分性质】【复杂度分析】

题意&#xff1a;一棵初始时为空的树&#xff0c;依次加入 nnn 个叶结点&#xff0c;每次加入后询问 用若干不同颜色的路径将树边染色后 每个点到根经过的颜色数 的最大值 的最小值。 n≤106n\leq 10^6n≤106 首先发现这个路径没啥用&#xff0c;其实就是个剖分方案。 然后我…

在Linux的Windows子系统上(WSL)使用Docker(Ubuntu)

背景平时开发大部人都是在提供了高效GUI的window下工作&#xff0c;但是真正部署环境普遍都是在Linux中&#xff0c;所以为了让开发环境和部署环境统一&#xff0c;我们需要在windows模拟LInux环境&#xff0c;以前我们可能通过虚拟机的方式实现&#xff0c;不过自从微软拥抱开…

NOIP2020 赛前总结

没有一眼秒的题都必须对拍&#xff0c;这里对拍包括疯狂造小数据人工检查。所以不会的话放心打暴力吧&#xff0c;反正写出来了也要对拍。码农题最后码。预估可能会失误&#xff0c;不要认为写一半就丢了很可惜&#xff0c;其他更可做的题没碰更可惜。想起了就把文件夹复制一遍…

.net持续集成cake篇之cake介绍及简单示例

cake介绍Cake 是.net平台下的一款自动化构建工具,可以完成对.net项目的编译,打包,运行单元测试,集成测试甚至发布项目等等.如果有些特征Cake没有实现,我们还可以很容易地通过扩展Cake来实现我们想要的功能.Cake有以下特点1) 使用c#语言编写,可以在Cake脚本里使用C#语言来实现我…

Educational Codeforces Round 73 (Rated for Div. 2) Make The Fence Great Again dp + 结论

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 首先证明一个结论&#xff1a;一个数最多被加两次。 首先假设a[i]a[i−1]a[i]a[i-1]a[i]a[i−1]或a[i]a[i1]a[i]a[i1]a[i]a[i1]&#xff0c;那么此时可以将a[i]a[i]1a[i]a[i]1a[i]a[i]1&am…

.NET Core 3.0 发布小尺寸 self-contained 单体可执行程序

.NET Core 提供的发布应用程序选项 self-contained 是共享应用程序的好方法&#xff0c;因为应用程序的发布目录包含所有组件、运行时和框架。您只需要告诉使用者应用程序的入口 exe 文件&#xff0c;就可以使程序运行起来&#xff0c;而不必担心目标计算机上是否存在.NET Core…

NOIP 2020 游记

Day -1 校内考试出阴间题&#xff0c;体验极差。 晚上写了发压位高精&#xff0c;一发 AC&#xff0c;感觉很飘&#xff08;flag&#xff09; Day 1 8:00 进考场 8:10 分发压缩包&#xff0c;随便点开看看&#xff0c;看题目名字感觉很友好。然后就在一个叫 ball 的文件夹…

Educational Codeforces Round 73 (Rated for Div. 2) E. Game With String 思维博弈 好题(2500)

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 我们将每一段...拿出来看成若干段&#xff0c;将其分成以下四种情况&#xff1a; (1)len<b(1)len<b(1)len<b (2)b≤len<a(2)b\le len<a(2)b≤len<a (3)a≤len<2∗b(3…

「Sqlserver」数据分析师有理由爱Sqlserver之三-最值得使有低投入高产出的Sqlserver功能...

数据分析师群体&#xff0c;有别于一般的传统开发群体和数据库运维群体&#xff0c;对Sqlserver的功能需求上也各不相同&#xff0c;本篇以笔者的亲身经历&#xff0c;用一种有别于一般性教程的角度来讲解Sqlserver值得我们学习&#xff0c;投入产出比高的一些功能模块。当然&a…

【WC2019】数树【子集反演】【结论】【树形dp】【生成函数】【函数求导】【多项式全家桶】

题意&#xff1a;有两棵基于同一点集的树&#xff0c;点集大小为 nnn &#xff0c;两棵树中有 opopop 棵未确定&#xff0c;可以取所有 nn−2n^{n-2}nn−2 种可能。给每个点染上 [1,y][1,y][1,y] 中的一个颜色&#xff0c;要求若 uuu 到 vvv 在两棵树上的路径完全相同&#xff…

Educational Codeforces Round 73 (Rated for Div. 2) F. Choose a Square 线段树 + 二维转一维

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你nnn个点(xi,yi)(x_i,y_i)(xi​,yi​)&#xff0c;每个点有个价值cic_ici​&#xff0c;现在你可以框一个正方形&#xff0c;要求左下角和右上角的坐标(x,y)(x,y)(x,y)必须xyxyxy&#xff0c;也就是说必须…