【题目描述】

你有一个空的多重集,你需要处理若干下列询问:

  1. ADD $ x $:加入一个数值为 $ 2^x $ 的元素到该多重集。
  2. GET $ w $:判断是否存在一个该多重集的子集,使得这个子集的所有元素之和等于 $ w $。

$ 1≤m≤105,0≤x≤29,0≤w≤109 $

【思路】

操作一:ADD

首先,这个多重集里面只有二的幂次方的数,所以我们可以定义一个 $ sum $ 数组来表示这个多重集,$ sum_i $ 表示这个多重集里面有多少个数值为 $ 2^i $ 的元素。

这样子,操作一就很好实现了,直接 $ sum_x+1 $ 就行。

操作二:GET

我们发现,如果要让这个多重集有一个子集加起来等于 $ w $,我们需要满足:

  • 对于 $ w $ 的二进制表示法,如果倒数第 $ i $ 位为 $ 1 $(最后一位算第 $ 0 $ 位),则多重集之中一定存在一个 $ 2^{i} $。

但是现在我们的多重集可能会有多个相同的元素,他们可以“进位”成一个新元素,就像两个 $ 2^x $ 可以合并为一个 $ 2^{x+1} $ 一样。

这就难办了,我们不但需要考虑 $ w $ 需不需要当前的 $ 2^x $,还要关心“进位”。

我们可以这么想:

  1. 把这个多重集复制到一个新数组 $ sum1 $ 里去(以防后面的操作改变这个多重集原本结构)。
  2. 从低到高扫 $ w $ 的二进制位。
  3. 如果 $ w $ 倒数第 $ i $ 位为 $ 1 $(最后一位算第 $ 0 $ 位),则它需要一个值为 $ 2^{i} $ 的元素,$ sum1_i-1 $。
  4. 把其他所有当前值的元素进位(反正已经没用了)。

如果在取 $ w $ 的某一个二进制位置,发现没有这个值的元素了,就说明拼不出来。

否则就可以通过选取和“进位”拼出来。

【Code】

#include <bits/stdc++.h>
using namespace std; int sum[35],sum1[35];
int m,op,x,w;
bool Output; int main()
{
scanf("%d",&m);
for(int i=1;i<=m;i++){
scanf("%d",&op);
if(op==1){
scanf("%d",&x);
sum[x]++;
}else{
scanf("%d",&w);
Output=false;
for(int i=0;i<=31;i++) sum1[i]=sum[i]; //1.分离临时数组
for(int i=0;i<=31;i++){ //2.从小到大枚举二进制位
int flag=w&(1<<i); //3.检查当前位是否需要元素
if(flag){
if(sum1[i]==0){ //需要,但是没有
puts("NO");
Output=true;
break;
}else{ //否则就用掉
sum1[i]--;
}
}
sum1[i+1]+=sum1[i]/2; //4.“进位”
}
if(!Output) puts("YES");
}
}
return 0;
}

CF1913C Game with Multiset 题解的更多相关文章

  1. ZOJ 3963 Heap Partition(multiset + stl自带二分 + 贪心)题解

    题意:给你n个数字s1~sn,要你把它们组成一棵棵二叉树,对这棵二叉树来说,所有节点来自S,并且父节点si<=子节点sj,并且i<j,问你树最少几棵二叉数.树 思路:贪心.我们往multi ...

  2. SPOJ ADAFIELD Ada and Field(STL的使用:set,multiset,map的迭代器)题解

    题意:n*m的方格,“0 x”表示x轴在x位置切一刀,“0 y”表示y轴在y位置切一刀,每次操作后输出当前面积最大矩形. 思路:用set分别储存x轴y轴分割的点,用multiset(可重复)储存x轴y ...

  3. 题解 CF1354D 【Multiset】

    考试拿到题,一看,这不是权值线段树吗? 思路 使用线段树每个节点维护该区间内元素出现次数. 根据题目,对于加入.删除元素,我们可以单点修改(\(+1\).\(-1\)),对于输出,我们可 随便 遍历找 ...

  4. Codeforces Round #367 (Div. 2) D. Vasiliy's Multiset (0/1-Trie树)

    Vasiliy's Multiset 题目链接: http://codeforces.com/contest/706/problem/D Description Author has gone out ...

  5. Codeforces Round #136 (Div. 1)C. Little Elephant and Shifts multiset

    C. Little Elephant and Shifts Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/pro ...

  6. Codeforces Round #311 (Div. 2) C. Arthur and Table Multiset

    C. Arthur and Table Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/557/p ...

  7. Codeforces Beta Round #6 (Div. 2 Only) E. Exposition multiset

    E. Exposition Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/problem/ ...

  8. noip2007提高组题解

    题外话:这一年的noip应该是最受大众关心的,以至于在百度上输入noip第三个关键字就是noip2007.主要是由于这篇文章:http://www.zhihu.com/question/2110727 ...

  9. QTREE系列题解

    打了快一星期的qtree终于打完了- - (其实还有两题改不出来弃疗了QAQ) orz神AK一星期前就虐完QTREE 避免忘记还是简单写下题解吧0 0 QTREE1 题意: 给出一颗带边权树 一个操作 ...

  10. Codeforces Round #278 (Div. 1) B. Strip multiset维护DP

    B. Strip Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/487/problem/B De ...

随机推荐

  1. Linux系统设置shell开机自启

        自己写一个shell脚本 chmod -x file.sh sudo cp file.sh /etc/profile.d/ 将写好的脚本(.sh文件)放到目录 /etc/profile.d/ ...

  2. c语言之遗漏---标准C的标记化结构初始化语法

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文发布于 2015-12-29 19:22:14 ...

  3. 5、Azure Devops之Azure Test Plans篇

    1.什么是Azure Test Plans Azure Test Plans是提供给团队测试人员,管理测试计划.测试套件.测试用例的部件.管理测试计划.测试用例的定义,包括请求类型定义.参数定义,执行 ...

  4. spring boot2集成api文档工具swagger-ui(上)

    说明 第一步:创建项目 浏览器打开:https://start.spring.io/,生成一个spring boot项目 点击Generate这个按钮,下载项目包文件 第二步:导入开发工具 打开下载目 ...

  5. 云VR给当今的教育行业带来哪些契机

    教育一直是国之根本大策,培养下一代高科技新型人才是新时代规划的重要建设目标.教育的授课方式也别出心裁,不断地涌现出教育的新模式.3DCAT 云VR别出心裁,为教育行业带来新的教学方式和简化管理的全新系 ...

  6. 云VR:虚拟现实专业化的下一步

    传统的VR通常需要功能强大的计算机和其他高性能设备来提供良好的用户体验.但是,如果有一种方法可以从任何设备和任何地方处理VR内容呢?这就是云VR对VR用户的承诺.随着5G和其他网络的到来,VR技术的未 ...

  7. 三维模型OBJ格式轻量化压缩处理效率提高的技术方法探讨

    三维模型OBJ格式轻量化压缩处理效率提高的技术方法探讨 要提高三维模型OBJ格式轻量化压缩处理的效率,可以采取以下方法: 1.优化算法选择:选择合适的优化算法对模型进行轻量化处理.不同的优化算法有不同 ...

  8. 记录--静态网站 H5 跳小程序,以及踩坑

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 背景 我司有智慧功成家APP和对应的小程序,现在已经实现APP分享到微信,微信点击分享链接直接进入小程序. 目前有一个问题就是我们APP在 ...

  9. mysql where子句 区分 大小写

    解决办法 使用binary关键字,此时就能区分大小写了 SELECT * FROM `tb_test` WHERE BINARY COL_1='abc'

  10. verilog基本语法之always和assign

    always和assign的作用 一.语法定义 assign,连续赋值.always,敏感赋值.连续赋值,就是无条件全等.敏感赋值,就是有条件相等.assign的对象是wire,always的对象是r ...