【BZOJ5498】[十二省联考2019]皮配(动态规划)

题面

BZOJ
洛谷

题解

先考虑暴力\(dp\),设\(f[i][j][k]\)表示前\(i\)所学校,有\(j\)人在某个阵营,有\(k\)人在某个派系的方案数。
发现如果\(k=0\),那么可以先决策每个城市选择哪一个阵营,再对于每个学校选择哪一个派系。显然两者之间不冲突,分开\(dp\)再乘起来就行了。
加入限制,每个限制的形式即在某个城市选定了某个阵营之后,这个学校只有一种选择。
先把没有限制的部分处理完,首先这些学校单独拎出来\(dp\)肯定没有问题。
不存在限制学校的城市也可以单独拎出来\(dp\)。
剩下的部分我们用前面的那个暴力\(dp\),这样子同时限制了两维就可以满足限制关系了。
最后我们枚举暴力\(dp\)的状态,利用前缀和就可以快速拼接两侧的答案。

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
#define MOD 998244353
#define MAX 2550
inline int read()
{int x=0;bool t=false;char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-')t=true,ch=getchar();while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();return t?-x:x;
}
int n,m,C0,C1,D0,D1,ans;
int fr[MAX],S[MAX],ss[MAX],sum;
int g1[MAX],g2[MAX];
vector<int> p[MAX];
int K,lim[MAX],Lim[MAX];
int f[MAX][MAX],g[MAX][MAX];
int Calc(int x,int y)
{int lc=max(0,sum-x-C1),rc=C0-x;int ld=max(0,sum-y-D1),rd=D0-y;if(lc>rc||ld>rd)return 0;return 1ll*(g2[rc]-(lc?g2[lc-1]:0)+MOD)*(g1[rd]-(ld?g1[ld-1]:0)+MOD)%MOD;
}
int main()
{int T=read();while(T--){n=read();m=read();C0=read();C1=read();D0=read();D1=read();for(int i=1;i<=n;++i){fr[i]=read();S[i]=read();sum+=S[i];ss[fr[i]]+=S[i];}K=read();for(int i=1;i<=n;++i)lim[i]=-1;for(int i=1;i<=m;++i)Lim[i]=-1;for(int i=1;i<=K;++i){int x=read(),q=read();lim[x]=Lim[fr[x]]=q;p[fr[x]].push_back(x);}g1[0]=g2[0]=1;int s1=0,s2=0;for(int i=1;i<=n;++i){s1+=S[i];if(~lim[i])continue;for(int j=min(s1,D0);j>=S[i];--j)g1[j]=(g1[j]+g1[j-S[i]])%MOD;}for(int i=1;i<=m;++i){s2+=ss[i];if(!ss[i]||~Lim[i])continue;for(int j=min(s2,C0);j>=ss[i];--j)g2[j]=(g2[j]+g2[j-ss[i]])%MOD;}for(int i=1;i<=D0;++i)g1[i]=(g1[i-1]+g1[i])%MOD;for(int i=1;i<=C0;++i)g2[i]=(g2[i-1]+g2[i])%MOD;f[0][0]=1;for(int i=1,sc=0,sd=0;i<=m;++i){if(!~Lim[i]||!ss[i])continue;for(int j=0;j<=C0&&j<=sc;++j)for(int k=0;k<=D0&&k<=sd;++k)g[j][k]=f[j][k];for(int qwq=0;qwq<(int)p[i].size();++qwq){int x=p[i][qwq];sd+=S[x];int t0=lim[x]!=0,t1=lim[x]!=1,t2=lim[x]!=2,t3=lim[x]!=3;for(int j=min(C0,sc);~j;--j)for(int k=min(D0,sd);~k;--k)if(k>=S[x]){f[j][k]=(f[j][k]*t1+f[j][k-S[x]]*t0)%MOD;g[j][k]=(g[j][k]*t3+g[j][k-S[x]]*t2)%MOD;}else f[j][k]=f[j][k]*t1,g[j][k]=g[j][k]*t3;}sc+=ss[i];for(int j=min(C0,sc);~j;--j)for(int k=min(D0,sd);~k;--k)if(j>=ss[i])f[j][k]=(f[j-ss[i]][k]+g[j][k])%MOD;else f[j][k]=g[j][k];}for(int i=0;i<=C0;++i)for(int j=0;j<=D0;++j)if(f[i][j])ans=(ans+1ll*f[i][j]*Calc(i,j))%MOD;printf("%d\n",ans);sum=ans=0;for(int i=0;i<=D0;++i)g1[i]=0;for(int i=0;i<=C0;++i)g2[i]=0;for(int i=1;i<=n;++i)fr[i]=S[i]=0,lim[i]=0;for(int i=1;i<=m;++i)p[i].clear(),ss[i]=0,Lim[i]=0;for(int i=0;i<=C0;++i)for(int j=0;j<=D0;++j)g[i][j]=f[i][j]=0;}return 0;
}

转载于:https://www.cnblogs.com/cjyyb/p/10715794.html

【BZOJ5498】[十二省联考2019]皮配(动态规划)相关推荐

  1. [十二省联考2019]皮配

    题目链接 选一个派系和一个阵营可以唯一确定一名导师 因为每一个阵营里的导师都分别来自不同派系,所以k=0时,对阵营的选择是不影响对派系的选择的 唯一的限制就是同城市的要在同一个阵营 所以以每个城市为物 ...

  2. 【LuoguP5289】[十二省联考2019] 皮配

    题目链接 题目描述 略 Sol 一道背包问题 首先暴力做法设 \(dp[i][j][k]\) 表示前 \(i\) 个城市的学校被分到第一阵营 \(j\) 人 第一门派 \(k\) 人的方案数. 中间一 ...

  3. 十二省联考 2019 题解

    [十二省联考2019]异或粽子 首先异或转前缀和,类似超级钢琴,将三元组 ( l , r , p ) (l,r,p) (l,r,p) 插入堆,表示 s u m [ p ] sum[p] sum[p] ...

  4. [十二省联考2019]春节十二响——长链剖分+堆

    题目链接: [十二省联考2019]春节十二响 可以发现每条链上的所有点都要放在不同的段里,那么最多只需要树的深度这么多段就够了. 因为这样可以保证每条链上的点可以放在不同的段中而且一个点放在这些段中一 ...

  5. 「十二省联考 2019」皮配——dp

    题目 [题目描述] #### 题目背景 一年一度的综艺节目<中国好码农>又开始了.本季度,好码农由 Yazid.Zayid.小 R.大 R 四位梦想导师坐镇,他们都将组建自己的梦想战队,并 ...

  6. 【十二省联考2019】春节十二响

    题面 https://www.luogu.org/problem/P5290 题解 真的是我傻逼,十二省联考$day2$至今还是我的噩梦.$day1$起码一直在调可持久化$trie$树,$day2$真 ...

  7. HAOI(十二省联考)2019 qwq记

    \(\large{Day\ -1}:\) 放假了,白天大概是抱着最后一次在机房的心态复习着板子过去的.看着机房里的各位神仙丝毫不慌的颓倒是有点慌了,敲了一下多项式的板子感觉写的相当自闭,感觉AFO应该 ...

  8. 十二省联考2019酱油记

    在中考前去省选玩一趟. Day -1 对于一个还没有学会所有省选内容的初三Oier来说,这一趟真的是去打酱油的啊.但还是要认真复习. 最近几天在字符串的路上越走越远-晚上才开始复习图论.还有一大堆没有 ...

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

    题意:有 nnn 个学校隶属于 ccc 个城市,每个学校有 sis_isi​ 个人.把它们放入一个 2×22\times 22×2 的格子中,要求同一学校的必须放在同一个格子,同一城市的必须放在同一行 ...

最新文章

  1. Oracle Sequence用plsql修改
  2. wamp 使用mysql_PHP当中如何使用Wampserver连接到Mysql数据库以及怎样使用
  3. getsimplename_Java类类getSimpleName()方法的示例
  4. python可以画动态图吗_matplotlib 画动态图以及plt.ion()和plt.ioff()的使用详解
  5. dbMigration .NET 数据同步迁移工具
  6. 探险家开发者 Niek Bokkers 的故事 | #IMakeApps
  7. 简易记事本android代码,Android实现简易记事本
  8. AI车牌识别涉及哪些技术?它是如何改变行业的?
  9. 详解CAN总线:CAN协议分层结构及功能
  10. php居民小区物业水电费管理系统mysql
  11. 微积分memo——一元函数积分学
  12. 汇编语言期末复习不挂科——知识点总结
  13. 通过京东白条了解资产证券化
  14. 【有限位移旋量理论】罗德里格旋转公式(Rodrigues Rotation Formula)
  15. 一款好的软件,软件测试必不可少...
  16. 原生js实现轮盘抽奖,控制中奖概率(完整示例)
  17. 1053 住房空置率 (20分)
  18. java判断List对象不为空
  19. 中国煤炭机械行业十四五需求规模与竞争形势分析报告2022版
  20. matplotlib绘制极坐标图 最全面总结

热门文章

  1. android app防止锁屏_如何控制Android不锁屏
  2. 微信小程序--邀请函
  3. C# 将PPT转为OFD、DPT、DPS、ODP、POTX、UOP
  4. 项目结束后,哪些经验教训需要总结?
  5. 视频标清、高清、超清、1080P(这么多不同规格)
  6. 【Django】图书管理
  7. 计算机协会见面会游戏,计算机协会新会员见面大会会长演讲稿
  8. 安排软件保护服务在 2022-07-26T23:00:43Z 时重新启动成功。原因: RulesEngine
  9. 包青天人声接电话搞笑版铃声 包青天人声接电话搞笑版手机铃声...
  10. iOS 逆向编程(五)通过 (OpenSSH) Wifi 远程连接登录 iPhone