博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces Round #367 (Div. 2) D. Vasiliy's Multiset (TireTree之位字典树)
阅读量:7090 次
发布时间:2019-06-28

本文共 1133 字,大约阅读时间需要 3 分钟。

题目链接:

题意:

对一个multiset(集合中的元素可以重复的set)有三种操作——

+ x: 增加元素x

- x: 减少元素x

?x: 求multiset中与x抑或得到的数最大为多少

已知0总是存在于multiset中。

 

分析:

时限为4s。

1 ≤ xi ≤ 109,由于109≈(2103≈230,103<210,也就是说x最多为30位

那么对数的每一位建立字典树,即最多为30层。

当要找与x抑或得到的结果最小的数时,只需尽可能找与x的每个数位相反的路径,

即可得到multiset中的那个数。

 

这样每个数都按照最大数可能的位数30来构建字典树,方便处理。

#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef long long ll;const int mod = 1000000007;const int maxn = 200010;const int len = 30;struct node{ int cnt; int next[2];}tree[maxn*len];int num;void init(){ memset(tree,-1,sizeof(tree)); num = 0;}void add(int x){ int now = 0; bool k; for(int i=len-1;i>=0;i--) { k = (x>>i)&1; if(tree[now].next[k]==-1) tree[now].next[k] = ++num; now = tree[now].next[k]; tree[now].cnt = tree[now].cnt==-1?1:(tree[now].cnt+1); }}void del(int x){ int now = 0; bool k; for(int i=len-1;i>=0;i--) { k = (x&(1<
=0;i--) { k = (x&(1<
0) k = !k; now = tree[now].next[k]; ret = ret|(k<
View Code

 

转载于:https://www.cnblogs.com/hadis-yuki/p/5768439.html

你可能感兴趣的文章
javascript 面向对象 new 关键字 原型链 构造函数
查看>>
日剧·日综资源集合(建议收藏)
查看>>
[译]go错误处理
查看>>
彩铅练习,樱桃
查看>>
yum 找不到程序, yum更换国内阿里源
查看>>
快速排序
查看>>
tomcat 、springboot远程调试
查看>>
1-AI--Activity生命周期
查看>>
SpringBoot集成RabbitMQ
查看>>
Ubuntu 14.04 将于4月30日停止支持,但可以购买“延保”
查看>>
Facebook 开源了一整套重要的 Linux 内核组件与工具!
查看>>
回顾互联网的过去十年(下)
查看>>
Spring AOP不拦截从对象内部调用的方法原因
查看>>
JSON.parse()和JSON.stringify()
查看>>
Github上如何在组织中的代码仓库里,为组织中的小组创建Pull Request(拉取请求/下载请求)?...
查看>>
Feign 与 Hystrix
查看>>
MongoDB之分片集群(Sharding)
查看>>
阿里巴巴的AI算法程序媛是怎样的一种存在?
查看>>
Pygame常用方法
查看>>
java基础学习_概述_day01总结
查看>>