CF1913C Game with Multiset 题解
【题目描述】
你有一个空的多重集,你需要处理若干下列询问:
- ADD $ x $:加入一个数值为 $ 2^x $ 的元素到该多重集。
- 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 $,还要关心“进位”。
我们可以这么想:
- 把这个多重集复制到一个新数组 $ sum1 $ 里去(以防后面的操作改变这个多重集原本结构)。
- 从低到高扫 $ w $ 的二进制位。
- 如果 $ w $ 倒数第 $ i $ 位为 $ 1 $(最后一位算第 $ 0 $ 位),则它需要一个值为 $ 2^{i} $ 的元素,$ sum1_i-1 $。
- 把其他所有当前值的元素进位(反正已经没用了)。
如果在取 $ 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 题解的更多相关文章
- ZOJ 3963 Heap Partition(multiset + stl自带二分 + 贪心)题解
题意:给你n个数字s1~sn,要你把它们组成一棵棵二叉树,对这棵二叉树来说,所有节点来自S,并且父节点si<=子节点sj,并且i<j,问你树最少几棵二叉数.树 思路:贪心.我们往multi ...
- 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 ...
- 题解 CF1354D 【Multiset】
考试拿到题,一看,这不是权值线段树吗? 思路 使用线段树每个节点维护该区间内元素出现次数. 根据题目,对于加入.删除元素,我们可以单点修改(\(+1\).\(-1\)),对于输出,我们可 随便 遍历找 ...
- 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 ...
- 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 ...
- 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 ...
- 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/ ...
- noip2007提高组题解
题外话:这一年的noip应该是最受大众关心的,以至于在百度上输入noip第三个关键字就是noip2007.主要是由于这篇文章:http://www.zhihu.com/question/2110727 ...
- QTREE系列题解
打了快一星期的qtree终于打完了- - (其实还有两题改不出来弃疗了QAQ) orz神AK一星期前就虐完QTREE 避免忘记还是简单写下题解吧0 0 QTREE1 题意: 给出一颗带边权树 一个操作 ...
- 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 ...
随机推荐
- GoFrame 优化接口的错误码和异常的思路
前言 你是否想在使用 GoFrame 的过程中,拥有一个能打印异常堆栈,能自定义响应状态码,能统一处理响应数据的接口.如果你回答是,那么,请耐心看完本文,或许会对你有所启发.若文中由表达不当之处,恳请 ...
- javascript import maps 特性现已被全部主流浏览器支持
值得庆祝 Import maps 特性现在可以在全部三个主要浏览器内使用 现在主流现代web 应用 引入和利用javascript 是通过 Es module 模块实现. 在开发javascript上 ...
- day10-Spring Cloud Alibaba Nacos-服务注册与配置中心
Spring Cloud Alibaba Nacos-服务注册与配置中心 官网:https://github.com/alibaba/nacos,Nacos官方中文手册 Nacos:Spring Cl ...
- 软件开发、持续集成(CI)、持续交付(CD)、持续部署(CD) 和 版本管理(Version Control) 的理解和思考
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- Spring Boot学习日记15
使用thymeleaf <!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.o ...
- 首届实时渲染3D动画创作大赛最佳人气奖?你说了算!
根据评选标准,经过评委组层层选拔,首届实时渲染3D动画创作大赛「最佳人气奖」投票开始啦!!! 本次赛事报名人数达212人,入围作品共40份,其中Omniverse组11份,专业组15份,学生组14份. ...
- 三维模型OBJ格式轻量化的跨平台兼容性问题分析
三维模型OBJ格式轻量化的跨平台兼容性问题分析 三维模型的OBJ格式轻量化在跨平台兼容性方面具有重要意义,可以确保模型在不同平台和设备上的正确加载和渲染.本文将分析OBJ格式轻量化的跨平台兼容性技术, ...
- 数据好合: Argilla 和 Hugging Face Spaces 携手赋能社区合力构建更好的数据集
最近,Argilla 和 Hugging Face 共同 推出 了 Data is Better Together 计划,旨在凝聚社区力量协力构建一个对提示进行排名的偏好数据集.仅用几天,我们就吸引了 ...
- struts2-66漏洞复现
Strut2-66漏洞从搭建到复现到原理 0x0 创建JavaEE环境 使用idea创建JavaEE项目,添加Strut2的依赖 点击右上角创建新项目 下一步,依赖项只选择一个Servlet就行了,版 ...
- 记录--vue3问题:如何实现微信扫码授权登录?
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.需求 微信扫码授权,如果允许授权,则登录成功,跳转到首页. 二.问题 1.微信扫码授权有几种实现方式? 2.说一下这几种实现方式的原理 ...