题目简述:

共有n个动物,m条要求,每条要求描述了第x位上是1的话,必须购买y饲料,动物园里已有的动物必须的饲料已经购买了,问题是:在不要求增加购买饲料的基础上,还能放进去多少种动物?共有k个二进制,数据保证输入的动物编号各不相同,给出的饲料种类各不相同,n和m的范围都是100万,饲料的范围是1亿,k的范围是64(k表示有多少个二进制)

题解:

1、暴力:

枚举动物,枚举m条要求,如果ai&&1<<xi==1的话,说明动物编号中满足这一条要求,b[i]=true;

暴力枚举i,范围在1<<k-1,枚举m条要求,如果b[j]==false,但是i&&1<<xi==true,则这个不满足

最终满足的是2的k次方减去n减去不满足要求的

2、正解

如果能找到有多少个位置符合要求,那么这些位置无论是0还是1都可以,1表示有这种饲料,0表示没这种饲料也行,最后符合要求的动物数量为1<<cnt个,去掉动物园的n个,就是  最后的答案。这里面有个重要的条件是饲料各不相同,也就是说不可能不同的二进制位对应相同的饲料,如果是这样的话,可能比较难处理,但是这里去掉了这个条件

我们可以把所有的动物编号都或起来,或之后的值为F,之后枚举m个要求,如果F|(1<<xi)!=F,那么说明这一个二进制没有,k--,同时设置这个值被访问过

最后,k表示哪些位置合法

3、改进

当然,如果这道题修改一下,不同的二进制位置可以对应相同的饲料,这样的话,此题的解法就完全不同,举个例子,1 4 5三个动物编号,0和2的二进制位有值,如果1和2都对应相同的饲料,那么其实相当于1也是合法的位置,这里就需要特殊的处理,杨宸骁的代码适合这种情况

这里,附上他的代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,c,k,x[1000005],y[1000005],lsh[1000005],cnt;
unsigned long long xx;
bool f[1000005],flag[1000005],ff[1000005],fff[1000005];
int main(){
// freopen("zoo.in","r",stdin);
// freopen("zoo.out","w",stdout);
cin>>n>>m>>c>>k;
if(n==0&&k==64){
cout<<"18446744073709551616";
return 0;
}
for(int i=1;i<=n;i++){
cin>>xx;
int j=1;
while(xx){
if(xx&1)f[j-1]=true;
xx/=2;
j++;
}
}
for(int i=1;i<=m;i++){
cin>>x[i]>>y[i];
lsh[i]=y[i];
}
sort(lsh+1,lsh+m+1);
int tot=unique(lsh+1,lsh+m+1)-lsh-1;
for(int i=1;i<=m;i++){
y[i]=lower_bound(lsh+1,lsh+tot+1,y[i])-lsh;
fff[x[i]]=true;
if(f[x[i]]==true)flag[y[i]]=true;
}
for(int i=1;i<=m;i++){
if(flag[y[i]]==true)ff[x[i]]=true;
}
for(int j=0;j<=k-1;j++){
if(ff[j]||!fff[j])cnt++;
}
cout<<(1ull<<cnt)-n<<endl;
return 0;
}

csp-s2020 T2 动物园的更多相关文章

  1. 「考试」CSP-S 2020

    乱扯 爆炸的过程是这样的 写了\(2.5h\)的\(T1\)过不去大样例,自闭了 决定调\(T2\)然后过了样例但事实上写的完全是假的 这个时候突然\(T1\)灵光一闪就没再看\(T2\)了 然后就一 ...

  2. 2019.10.29 CSP%您赛第四场t2

    我太菜了我竟然不会分层图最短路 ____________________________________________________________________________________ ...

  3. HeRaNO's NOIP CSP Round Day 2 T2 PESTC

    对于我这种菜鸡来说还是挺有迷惑性的. 在考场发现答案问的是跟最值有关的数量,想到二分,结果果然具有单调性,考虑二份答案+验证 其实什么反转什么的,可以不用去管他,对于长度小于二分答案mid的道路,不去 ...

  4. UOJ #5. 【NOI2014】动物园 扩大KMP

    第一次NOI称号. ... 扩展假设知道KMP如果. .. . 就是水题了. ... #5. [NOI2014]动物园 统计提交情况 描写叙述 提交 近日.园长发现动物园中好吃懒做的动物越来越多了.比 ...

  5. CSP 2019 游记

    Day -32 开坑. 没什么好说的,等个 5 天等初赛(应该叫第一轮认证)挂掉之后就能弃坑了. 今天开始停课,虽然每天只停半天,但是感觉还是特别的舒服~ 然而得等初赛过了才能全天停课-- 没关系,熬 ...

  6. 【CSP游记S】

    简略:初三小蒟蒻本想体验一下提高,结果尝到了省选的滋味.fclose没有打,目前不知道会不会有影响,很伤心. day 1 大早上的6:30起床天好黑啊~,想起这次没有面包吃,到华生园买了包熊博士(毕竟 ...

  7. [bzoj1151][CTSC2007]动物园zoo_状压dp

    动物园zoo 题目大意:https://www.lydsy.com/JudgeOnline/problem.php?id=1151 题解: 我们发现每个点只会往右延伸$5$个,这个数非常小. 再加上每 ...

  8. 第十八次CSP认证游记 | 2019.12.15

    CSP认证的考试是Haogod介绍的,取得一定成绩之后能有机会参加CCSP的分赛区和全国决赛.这次来参加认证要感谢老师的奔走为我们申请学校的报销,虽然最终因为这不是比赛所以报名费和差旅费下不来,但是老 ...

  9. 「CSP」第一届提高组考后总结

    「CSP」第一届提高组考后总结 问题分析+反思 成绩 心态 考前心态 考时心态 考后心态 方法 心灵鸡汤... 在学习了三年之后,我们信竞迎来了初中最后一次大考,也是第一次 CSPCSPCSP 考试. ...

  10. 2020 CSP&NOIP 游记

    CSP初赛 CSP初赛 Day -1 早上打了模拟赛,T2寒假正好做过,然而还是还是被踩Orz,郑外NB!.中午出校吃了大盘鸡和拉面,还带回来了三瓶可乐. 初赛知识点看了两页不(看)想(不)看(懂)了 ...

随机推荐

  1. 取出每个分组的的第一条数据sql

    select * from(select id,detail, ROW_NUMBER()over(PARTITION By detail ORDER BY detail DESC) as rnfrom ...

  2. 基于C++的OpenGL 05 之坐标系统

    1. 引言 本文基于C++语言,描述OpenGL的坐标系统 前置知识可参考: 基于C++的OpenGL 04 之变换 - 当时明月在曾照彩云归 - 博客园 (cnblogs.com) 笔者这里不过多描 ...

  3. redis(13)持久化操作-AOF

    AOF(Append Only File) 以日志的形式来记录每个写操作(增量保存),将 Redis 执行过的所有写指令记录下来 (读操作不记录), 只许追加文件但不可以改写文件,redis 启动之初 ...

  4. Angular ngx-translate 国际化实践(中文转英文)

    1.安装包 npm install @ngx-translate/core --save npm install @ngx-translate/http-loader --save 2.根模块app. ...

  5. AD域

    一.介绍 [域] 存放在 [活动目录] 存放在 [域控制器] 二.域和活动目录的规划 三.安装域控制器

  6. python编写程序练习-车牌摇号程序

    import random import string count = 0      #设定计数器 car_numbers = []   # 创建一个列表,用来接收生产的车牌号池 while coun ...

  7. ABAP PDF 打印

    SPAN { font-family: "Courier New"; font-size: 10pt; color: rgba(0, 0, 0, 1); background: r ...

  8. 微信小程序与微信公众号之间支付问题解决方案

    前言 大家好,我是一名对编程有兴趣的小伙子,IT届称我为xiager,工作中叫我jake 就好了,如果此文对你有帮助希望多多关注哦. 准备 微信公众平台 微信支付平台 微信开放平台 一. 小程序    ...

  9. N63050 第一周运维作业

    1.按系列罗列Linux的发行版,并描述不同发行版之间的联系与区别. slackware:SUSE Linux Enterprise Server (SLES) , OpenSuse桌面debian: ...

  10. GitLab服务器修改用户密码

    重置密码: 1.切换到相应路径 cd /opt/gitlab/bin/2.进入控制台 gitlab-rails console3.根据序号查询用户账号信息并赋值给u u=User.find(2) [注 ...