热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

NOI.ac2020省选模拟赛5

比赛链接A.ZYB的测验计划problem有\(m\)道题,\(n\)个人,每个人对于每道题都有一个答案且每个人都可能来或不来,求出对于所有可能的\({2^m-1}\)个题目子集,

比赛链接


A.ZYB的测验计划

problem

\(m\)道题,\(n\)个人,每个人对于每道题都有一个答案且每个人都可能来或不来,求出对于所有可能的\({2^m-1}\)个题目子集,每个子集有多少是有区分度的。一个题目子集有区分度当且仅当子集中的每个题都有人回答NO也也有人回答YES。

\(n\le 10^5,m\le15\)


solution

暴力出奇迹

\(f(S)\)表示S这个集合中的题目全都没有区分度的方案数,其他的题目随意。求出f之后容斥一下就能得到答案。

考虑如何求\(f(S)\)。我们先枚举集合\(S\),既然没有区分度,那么集合S中的元素必须全是YES或全是NO。枚举S的子集,然后求出与这些子集在S这个集合中的位置都恰好相等的数量。计算一下即可。


code

/*
* @Author: wxyww
* @Date: 2020-06-05 10:45:24
* @Last Modified time: 2020-06-05 18:46:44
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int N = 1 <<16,mod = 998244353;
ll read() {
ll x = 0,f = 1;char c = getchar();
while(c <'0' || c > '9') {
if(c == '-') f = -1; c = getchar();
}
while(c >= '0' && c <= '9') {
x = x * 10 + c - '0'; c = getchar();
}
return x * f;
}
int n,m;
namespace BF1 {
int f[N],sum[N],cnt[N],tsum[N],mi[100010];//f(S)表示集合S中的题目全都没有区分度的方案数
char s[21];
void getf(int x) {
memset(tsum,0,sizeof(tsum));
for(int i = 0;i <(1 < tsum[i & x] += sum[i];
}
for(int i = x;;i = (i - 1) & x) {
if(tsum[i])
f[x] += (mi[tsum[i]] - 1);
// if(x == 3) printf("%d %d\n",i,mi[tsum[i]]);
f[x] >= mod ? f[x] -= mod : 0;
if(!i) break;
}
f[x]++;
f[x] %= mod;
}
void main() {
mi[0] = 1;
for(int i = 1;i <= n;++i) {
mi[i] = (mi[i - 1] <<1) % mod;
scanf("%s",s + 1);
int t = 0;
for(int j = 1;j <= m;++j)
t = t <<1 | (s[j] - '0');
sum[t]++;
}
for(int i = 0;i <(1 < cnt[i] = cnt[i >> 1] + (i & 1);
for(int i = 0;i <(1 < getf(i);
// cout< ll anss = 0;
for(int i = 1;i <(1 < ll ans = 0;
for(int j = i;;j = (j - 1) & i) {
int k = 1;
if(cnt[j] & 1) k = -1;
ans += k * f[j];
ans %= mod;
if(!j) break;
}
ans = (ans + mod) % mod;
anss ^= ans;
}
cout< }
}
int main() {
n = read(),m = read();
// if(m <= 10) {
BF1::main();return 0;
// }
return 0;
}

B.function

咕咕咕


C.光滑序列

problem

对于一个长度为\(n\)的序列,说他是光滑的当且仅当任意\(K\)个相邻元素的和都是\(S\)。给出一个长度为\(n\)的非负整数序列,问至少需要修改多少个元素才能使序列A变成光滑的序列。

\(k\le n\le 5000,0\le A_i\le S\le 5000\)


solution

显然模\(k\)意义下相等的位置要放的数字必须是相等的。所以把模\(k\)意义下相等的位置放到一起进行\(dp\)

\(f[i][j]\)表示前i个位置和为j最多不需要修改的元素数量。然后我们枚举一下所有对k取模为i的位置中的数字进行转移,即加入一种数字x在模k为i的位置出现过y次,那么就有\(f[i][j] = max(f[i][j],f[i-1][j-x]+y)\)

那么如果第i个位置我们不修改成已有的位置,应该怎么转移呢。

因为不修改成已有位置造成的贡献是固定的。如果我们修改成\(x\),那么就有\(f[i][j] = max(f[i][j],f[i-1][j-x])\)。前缀和优化一下即可。

最后答案就是\(n-f[k-1][S]\)


code

/*
* @Author: wxyww
* @Date: 2020-06-05 07:56:07
* @Last Modified time: 2020-06-05 08:50:29
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int N = 5004;
ll read() {
ll x = 0,f = 1;char c = getchar();
while(c <'0' || c > '9') {
if(c == '-') f = -1; c = getchar();
}
while(c >= '0' && c <= '9') {
x = x * 10 + c - '0'; c = getchar();
}
return x * f;
}
int w[N][N],f[N][N],sum[N][N];
vectora[N];
vector::iterator it;
int main() {

// freopen("1.in","r",stdin);
int n = read(),K = read(),S = read();
for(int i = 0;i int x = read();
if(!w[i % K + 1][x])
a[i % K + 1].push_back(x);
w[i % K + 1][x]++;
}
memset(f,-0x3f,sizeof(f));
f[0][0] = 0;
for(int i = 1;i <= K;++i) {
for(int j = 0;j <= S;++j) {
for(it = a[i].begin();it != a[i].end();++it) {
if(j <(*it)) continue;
f[i][j] = max(f[i][j],f[i - 1][j - (*it)] + w[i][*it]);
}
sum[i][j] = f[i][j] = max(f[i][j],sum[i - 1][j]);
if(j) sum[i][j] = max(sum[i][j],sum[i][j - 1]);

}
}
cout< return 0;
}

===================================================================================


该怎麼去形容为思念酝酿的痛


夜空霓虹都是我不要的繁荣
===================================================================================



推荐阅读
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
author-avatar
小七
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有