【题目描述】

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

  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. iptables五表五链及对应实例

    iptables是Linux系统上用于配置网络包过滤规则的工具,它使用表(tables)和链(chains)来组织规则.以下是iptables中的五表五链及其对应的实例说明: 五表 filter表:默 ...

  2. 新服务器搭建docker跑mysql+java项目

    参考:https://js.work/posts/1362ba443b35d(yum安装java17) 踩了两个坑,一个前面的conf文件里监听80的配置没有删除掉,一个项目配置里面的路径还在用服务器 ...

  3. Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC

    Javabase64macmd5sha     加密解密,曾经是我一个毕业设计的重要组件.在工作了多年以后回想当时那个加密.解密算法,实在是太单纯了.     言归正传,这里我们主要描述Java已经实 ...

  4. Grails批改默认启动端口

    Grails修改默认启动端口 Grails默认启动端口号是8080,有几种修改的方式: 一.在官网文档中有介绍: grails -Dserver.port=8090 run-app -Dserver. ...

  5. 巧用Maya轴心操作小技巧,工作事半功倍!

    Maya 是一款专业的三维软件,可以用于创建规模宏大的世界.复杂的角色和炫酷的特效.Maya的用户遍布动画行业.影视特效.广告和片头.平面设计行业,用户数量十分庞大.本文分享了maya轴心操作的小技巧 ...

  6. window10-yarn-使用vite创建vue3项目失败-文件夹或目录不正确

    前置条件 window10 本地已经安装nodejs yarn已经通过npm全局安装(npm install -g yarn) 问题 yarn脚手架方式搭建vue3项目失败(command faile ...

  7. 《.NET内存管理宝典 》(Pro .NET Memory Management) 阅读指南 - 第10章

    本章勘误: 暂无,等待细心的你告诉我哦. 本章注解: 暂无 本章释疑: 暂无,等待你的提问 致谢: MVP 林德熙 MVP 吕毅 sPhinX 相关链接 试读记录

  8. html 本地预览图片 图片上绘制矩形框

    效果如图 完整html代码如下 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" / ...

  9. C# OpenCv DNN 人脸检测

    using OpenCvSharp; using OpenCvSharp.Dnn; using System; using System.Collections.Generic; using Syst ...

  10. KingbaseES Json 系列五--Json数据操作函数三

    KingbaseES Json 系列五:Json数据操作函数三(JSONB_SET,JSONB_INSERT,JSON_QUERY) JSON 数据类型是用来存储 JSON(JavaScript Ob ...