【LOJ】#3051. 「十二省联考 2019」皮配
LOJ#3051. 「十二省联考 2019」皮配
当时我在考场上觉得这题很不可做。。。
当然,出了考场后再做,我还是没发现学校和城市是可以分开的,导致我还是不会
事实上,若一个城市投靠了某个阵营,学校可以任意选择派系,但是反过来看,学校选择了派系,也不影响城市投靠什么阵营,而这两者共同固定了一个学校选择的导师,所以对于k = 0的情况
我们设两个dp,\(g[i][j]\)表示考虑了前i个城市,去蓝阵营的人数为j,\(h[i][j]\)表示考虑了前i个城市,去鸭派系的人数为j,最后只需要把合法的分别乘起来就好
对于\(k!=0\)的情况,没有限制的城市,和没有限制的学校,都可以按照k = 0的方案去做
然而这些限制给的是什么呢,可以认为是选了一些蓝阵营的城市,将导致我们必须选鸭派系或者必须选R派系,选了红阵营亦然。这个时候两者就有关系了,所以设\(f[i][j][k]\)是考虑了前i个有限制的城市,选了蓝阵营的城市总人数为\(j\)在,在有限制的学校中选了鸭派系的人数是\(k\)
滚动数组就可以开的下了
然后答案合并的时候是会选择g和h一段连续的区间和\(f[i][j][k]\)合并,计算上下界查区间和即可
#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define eps 1e-10
#define ba 47
//#define ivorysi
#define MAXN 50010
#define MAXM 200005
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
template<class T>
void read(T &res) {
res = 0;T f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 +c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
const int MOD = 998244353;
int n,c,k,C0,C1,D0,D1;
vector<int> city[1005];
int f[2505][305],g[2505],h[2505],tmp[305];
int b[1005],s[1005],p[1005],all;
bool lim[1005],dl[1005];
int inc(int a,int b) {
return a + b >= MOD ? a + b - MOD : a + b;
}
int mul(int a,int b) {
return 1LL * a * b % MOD;
}
void update(int &x,int y) {
x = inc(x,y);
}
void Init() {
read(n);read(c);
read(C0);read(C1);read(D0);read(D1);
for(int i = 1 ; i <= c ; ++i) city[i].clear();
memset(lim,0,sizeof(lim));memset(dl,0,sizeof(dl));
all = 0;
for(int i = 1 ; i <= n ; ++i) {
read(b[i]);read(s[i]);all += s[i];
city[b[i]].pb(i);
}
read(k);
int a;
for(int i = 1 ; i <= k ; ++i) {
read(a);read(p[a]);
dl[a] = 1;lim[b[a]] = 1;
}
}
void Solve() {
memset(g,0,sizeof(g));
g[0] = 1;
for(int i = 1 ; i <= c ; ++i) {
if(!lim[i] && city[i].size() > 0) {
int sum = 0;
for(auto t : city[i]) {
sum += s[t];
}
for(int j = C0; j >= sum ; --j) {
update(g[j],g[j - sum]);
}
}
}
memset(h,0,sizeof(h));
h[0] = 1;
for(int i = 1 ; i <= n ; ++i) {
if(!dl[i]) {
for(int j = D0 ; j >= s[i] ; --j) {
update(h[j],h[j - s[i]]);
}
}
}
memset(f,0,sizeof(f));
f[0][0] = 1;
int tot = 0,nl = 0;
for(int i = 1 ; i <= c ; ++i) {
if(lim[i]) {
int sum = 0,s1 = 0;
for(auto t : city[i]) {
sum += s[t];
if(dl[t]) s1 += s[t];
}
tot = tot + sum;tot = min(tot,C0);
nl = nl + s1;nl = min(nl,D0);
for(int j = tot; j >= 0 ; --j) {
for(int r = 0 ; r <= nl ; ++r) tmp[r] = f[j][r];
for(auto t : city[i]) {
if(dl[t]) {
if(p[t] >= 2) {
if(p[t] == 2) continue;
else {
for(int r = nl ; r >= 0 ; --r) {
if(r >= s[t]) tmp[r] = tmp[r - s[t]];
else tmp[r] = 0;
}
}
}
else {
for(int r = nl ; r >= s[t] ; --r) update(tmp[r],tmp[r - s[t]]);
}
}
}
for(int r = 0 ; r <= nl ; ++r) f[j][r] = tmp[r];
if(j >= sum) {
for(int r = 0 ; r <= nl ; ++r) tmp[r] = f[j - sum][r];
for(auto t : city[i]) {
if(dl[t]) {
if(p[t] < 2) {
if(p[t] == 0) continue;
else {
for(int r = nl ; r >= 0 ; --r) {
if(r >= s[t]) tmp[r] = tmp[r - s[t]];
else tmp[r] = 0;
}
}
}
else {
for(int r = nl ; r >= s[t] ; --r) update(tmp[r],tmp[r - s[t]]);
}
}
}
for(int r = 0 ; r <= nl ; ++r) update(f[j][r],tmp[r]);
}
}
}
}
for(int i = 1 ; i <= C0 ; ++i) update(g[i],g[i - 1]);
for(int i = 1 ; i <= D0 ; ++i) update(h[i],h[i - 1]);
int ans = 0;
for(int i = 0 ; i <= C0 ; ++i) {
for(int j = 0 ; j <= 300 ; ++j) {
int t0 = 0,t1 = 0;
int u = C0 - i,d = all - C1 - i;
if(d <= u) {
t0 = g[u];
if(d > 0) update(t0,MOD - g[d - 1]);
}
u = D0 - j,d = all - D1 - j;
if(d <= u) {
t1 = h[u];
if(d > 0) update(t1,MOD - h[d - 1]);
}
update(ans,mul(f[i][j],mul(t0,t1)));
}
}
out(ans);enter;
cerr << ans;
}
int main(){
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
int T;
read(T);
for(int i = 1 ; i <= T ; ++i) {
Init();
Solve();
}
}
【LOJ】#3051. 「十二省联考 2019」皮配的更多相关文章
- 「十二省联考 2019」皮配——dp
题目 [题目描述] #### 题目背景一年一度的综艺节目<中国好码农>又开始了.本季度,好码农由 Yazid.Zayid.小 R.大 R 四位梦想导师坐镇,他们都将组建自己的梦想战队,并率 ...
- LOJ #3049. 「十二省联考 2019」字符串问题
LOJ #3049. 「十二省联考 2019」字符串问题 https://loj.ac/problem/3049 题意:给你\(na\)个\(A\)类串,\(nb\)个\(B\)类串,\(m\)组支配 ...
- LOJ#3048. 「十二省联考 2019」异或粽子 Trie
原文链接www.cnblogs.com/zhouzhendong/p/LOJ3048.html 题解 $O(n\log^2 {a_i})$ 的做法比较简单: 1. 求出第 k 大的是什么: 二分答案, ...
- LOJ#3052. 「十二省联考 2019」春节十二响(启发式合并)
题面 传送门 题解 先考虑一条链的情况,对于\(1\)号点来说,肯定是左子树中最大值和右子树中最大值一组,左子树中次大值和右子树中次大值一组--以此类推 那么如果不是一条链呢?我们把所有的链合并起来就 ...
- LOJ#3048. 「十二省联考 2019」异或粽子(trie树+堆)
题面 传送门 题解 我们先把它给前缀异或和一下,然后就是要求前\(k\)大的\(a_i\oplus a_j\).把\(k\)乘上个\(2\),变成前\(2k\)大的\(a_i\oplus a_j\), ...
- 「ZJOI2019」&「十二省联考 2019」题解索引
「ZJOI2019」&「十二省联考 2019」题解索引 「ZJOI2019」 「ZJOI2019」线段树 「ZJOI2019」Minimax 搜索 「十二省联考 2019」 「十二省联考 20 ...
- 「十二省联考 2019」字符串问题——SAM+DAG
题目 [题目描述] Yazid 和 Tiffany 喜欢字符串问题.在这里,我们将给你介绍一些关于字符串的基本概念. 对于一个字符串 $S$, 我们定义 $\lvert S\rvert$ 表示 $S$ ...
- LOJ 3049: 洛谷 P5284: 「十二省联考 2019」字符串问题
题目传送门:LOJ #3049. 题意简述: 给定一个长度为 \(n\) 的母串 \(S\). 有 \(n_a\) 个 A 类串,都是 \(S\) 的子串,以区间的形式给出. 有 \(n_b\) 个 ...
- 【LOJ 3049】「十二省联考 2019」字符串问题
这个D1T2绝对有毒... 首先我们构造一把反串的后缀自动机. 然后我们就需要找到每一个子串在SAM上的节点. 这个可以通过扫描线+树上倍增处理. 首先我们把所有的子串按照左端点排序, 然后从右往左扫 ...
随机推荐
- Onpaint()函数中绘图出现问题:当多次进入onpaint()发现次数达到一定程度就会出现窗口不能再重绘导致窗口内容损坏的现象
我在一个按钮中调用sendmessage(wm_paint,0,0)达到36以上时,当最小化窗口然后再恢复就会发现窗口出现错误信息,而且窗口界面内容混乱不完整.原来以为是使用sleep()函数导致的问 ...
- seq2seq聊天模型(一)
原创文章,转载请注明出处 最近完成了sqe2seq聊天模型,磕磕碰碰的遇到不少问题,最终总算是做出来了,并符合自己的预期结果. 本文目的 利用流程图,从理论方面,回顾,总结seq2seq模型, seq ...
- Luogu5298 [PKUWC2018]Minimax
太久没写博客了,过来水一发. 题目链接:洛谷 首先我们想到,考虑每个叶节点的权值为根节点权值的概率.首先要将叶节点权值离散化. 假设现在是$x$节点,令$f_i,g_i$分别表示左/右节点的权值$=i ...
- 将省市县三级联动的json数据,转化为element-ui能用的格式,并使用
var options=[]; var cities = { '北京': { '北京': ['东城区', '西城区', '崇文区', '宣武区', '朝阳区', '丰台区', '石景山区', '海淀区 ...
- React的基本认识
1.1.1. 官网 1) 英文官网: https://reactjs.org/ 2) 中文官网: https://doc.react-china.org/ 1.1.2. 介绍描述 1) 用于构建用户 ...
- StringUtils的isNotEmpty,isNotBlank方法的区别
这两个用着用着老是混淆或者忘记,今天写一下做个笔记,对比下两个判断方法的区别 isNotEmpty: 判断某字符串是否非空,等于!isEmpty(String str),这里不能排除空格字符 Stri ...
- SSH交互式脚本StrictHostKeyChecking选项 benchmode=yes
SSH 公钥检查是一个重要的安全机制,可以防范中间人劫持等黑客攻击.但是在特定情况下,严格的 SSH 公钥检查会破坏一些依赖 SSH 协议的自动化任务,就需要一种手段能够绕过 SSH 的公钥检查. 什 ...
- 错误Uncaught Error: Bootstrap's JavaScript requires jQuery at bootstrap.min.js:6 错误详解
引入Bootstrap的顺序进行修改 <% //获取以/开始,不以/结尾的部分 pageContext.setAttribute("APP_PATH", request.ge ...
- 进程| 线程 | 阻塞 | 阻塞&非阻塞 和 同步&异步
阻塞&非阻塞 阻塞IO 调用之后一定要等到系统内核完成所有的操作之后才结束,因此它的缺点:CPU等待IO,处理能力得不到充分利用. 非阻塞IO 为了解决阻塞IO带来的一些问题,内核提供了非阻塞 ...
- P1944 最长括号匹配_NOI导刊2009提高(1)
P1944 最长括号匹配_NOI导刊2009提高 题解 宁愿相信世上有鬼,也不能随便相信某谷题目标签 我想了半天然后看了眼题解,发现用栈来模拟就好了 栈来模拟,还要用到一个bool数组,标记是否已经匹 ...