题目描述

一个可重复数字集合S的神秘数定义为最小的不能被S的子集的和表示的正整数。例如S={1,1,1,4,13},

1 = 1

2 = 1+1

3 = 1+1+1

4 = 4

5 = 4+1

6 = 4+1+1

7 = 4+1+1+1

8无法表示为集合S的子集的和,故集合S的神秘数为8。

现给定n个正整数a[1]..a[n],m个询问,每次询问给定一个区间l,r,求由a[l],a[l+1],…,a[r]所构成的可重复数字集合的神秘数。

题解

加入我们查询的区间为l-r。

我们先查询有几个1,然后发现有k个,那么然后我们再查询1-k+1有多少数,如果大于等于k+1的话,那么1到k+1都能表出。

重复这个过程即可,最多跳log次。

代码

#include<iostream>
#include<cstdio>
#define N 100002
using namespace std;
typedef long long ll;
const int maxn=1e9;
ll tr[N*],a[N];
int L[N*],R[N*],tot,n,m,T[N];
inline int rd(){
int x=;char c=getchar();bool f=;
while(!isdigit(c)){if(c=='-')f=;c=getchar();}
while(isdigit(c)){x=(x<<)+(x<<)+(c^);c=getchar();}
return f?-x:x;
}
void ins(int &cnt,int pre,int l,int r,ll x){
cnt=++tot;
tr[cnt]=tr[pre]+x;L[cnt]=L[pre];R[cnt]=R[pre];
if(l==r)return;
int mid=(l+r)>>;
if(mid>=x)ins(L[cnt],L[pre],l,mid,x);
else ins(R[cnt],R[pre],mid+,r,x);
}
ll query(int cnt,int pre,int l,int r,ll x){
// cout<<cnt<<" "<<pre<<" "<<l<<" "<<r<<" "<<tr[cnt]<<" "<<tr[pre]<<endl;
if(!cnt)return ;
if(r<=x)return tr[cnt]-tr[pre];
int mid=(l+r)>>;
if(mid<x)return tr[L[cnt]]-tr[L[pre]]+query(R[cnt],R[pre],mid+,r,x);
else return query(L[cnt],L[pre],l,mid,x);
}
int main(){
n=rd();int m;
for(int i=;i<=n;++i)a[i]=rd(),ins(T[i],T[i-],,maxn,a[i]);
m=rd();int l,r;
while(m--){
l=rd();r=rd();
// cout<<"****"<<endl;
ll ans=,now=;
while(ans<=maxn){
// cout<<ans<<endl;
ans=query(T[r],T[l-],,maxn,ans);
// cout<<ans<<" "<<now<<endl;
if(ans<now)break;else now=ans+,ans=now;
}
printf("%lld\n",ans+);
}
return ;
}

[FJOI2016]神秘数(脑洞+可持久化)的更多相关文章

  1. (bzoj4408)[FJOI2016]神秘数(可持久化线段树)

    (bzoj4408)[FJOI2016]神秘数(可持久化线段树) bzoj luogu 对于一个区间的数,排序之后从左到右每一个数扫 如果扫到某个数a时已经证明了前面的数能表示[1,x],那么分情况: ...

  2. 【BZOJ4408】[FJOI2016]神秘数(主席树)

    [BZOJ4408][FJOI2016]神秘数(主席树) 题面 BZOJ 洛谷 题解 考虑只有一次询问. 我们把所有数排个序,假设当前可以表示出的最大数是\(x\). 起始\(x=0\). 依次考虑接 ...

  3. 【LG4587】[FJOI2016]神秘数

    [LG4587][FJOI2016]神秘数 题面 洛谷 题解 首先我们想一想暴力怎么做 对于一段区间\([l,r]\) 我们先将它之间的数升序排序 从左往右扫, 设当前我们可以表示出的数为\([1,x ...

  4. BZOJ 4408 FJOI2016 神秘数 可持久化线段树

    Description 一个可重复数字集合S的神秘数定义为最小的不能被S的子集的和表示的正整数.例如S={1,1,1,4,13},1 = 12 = 1+13 = 1+1+14 = 45 = 4+16 ...

  5. [bzoj4408][Fjoi2016]神秘数

    Description 一个可重复数字集合$S$的神秘数定义为最小的不能被$S$的子集的和表示的正整数. 例如$S={1,1,1,4,13}$, $1=1$, $2=1+1$, $3=1+1+1$, ...

  6. Luogu P4587 [FJOI2016]神秘数

    一道好冷门的好题啊,算是对于一个小结论和数据结构的一点考验吧 首先看完题目我们发现要从这个神秘数的性质入手,我们观察or手玩可得: 如果有\(x\)个\(1\),那么\([1,x]\)都是可以表示出来 ...

  7. bzoj 4408: [Fjoi 2016]神秘数 数学 可持久化线段树 主席树

    https://www.lydsy.com/JudgeOnline/problem.php?id=4299 一个可重复数字集合S的神秘数定义为最小的不能被S的子集的和表示的正整数.例如S={1,1,1 ...

  8. BZOJ4299 & CC FRBSUM:ForbiddenSum & BZOJ4408 & 洛谷4587 & LOJ2174:[FJOI2016]神秘数——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4299 https://www.lydsy.com/JudgeOnline/problem.php? ...

  9. 洛谷 P4587 [FJOI2016]神秘数

    大鸽子 llmmkk 正在补8.3号咕掉的题 时隔两个月,再看到这道题,我又是一脸懵,这种思维的培养太重要了 链接: P4587 题意: 给出 \(n\) 个点的序列,\(m\) 次询问区间神秘数. ...

随机推荐

  1. 【Python3练习题 002】企业发放的奖金根据利润提成

    # [Python练习题 002]企业发放的奖金根据利润提成.# 利润(I)低于或等于10万元时,奖金可提10%:利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分, ...

  2. 转:MD5(Message-Digest Algorithm 一种哈希算法)

    什么是MD5算法 MD5讯息摘要演算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码杂凑函数,可以产生出一个128位元(16位元组)的散列值(hash val ...

  3. Redis 使用命令行的方式 获取 hash type key 的value值

    1. 之前只是非常简单的看了下 get key 和 set key 但是这样 设置的 key value 应该是都 string 类型的 2. 但是没考虑过其他类型的 是如何获取 相关内容的 ,一直 ...

  4. JavaMail入门第一篇 邮件简介及API概述

    现如今,电子邮件在我们的生活当中扮演着越来越重要的角色,我们每个人几乎都会与其打交道(至少时不时我们都会接收到莫名其妙的垃圾邮件),在工作中,使用邮件进行交流沟通,可以使我们的工作有迹可循,也显的较为 ...

  5. Day 4-4 shutil模块

    常用方法: import shutil f = open("conf.ini", "r") f1 = open("shutil.ini", ...

  6. SAP配置BOM的适用范围

    配置BOM中定义属性,单纯的编码要搞死人: 适合小批量周期短多品种

  7. Django Rest framework 框架之解析器

    解析器 序列化***** 请求数据进行校验 对queryset进行序列化处理 分页 路由 视图 渲染器

  8. Python时间的简单使用

    1.time.strptime(string[, format]),string -- 时间字符串.format -- 格式化字符串.返回struct_time对象.     把字符串转换为时间格式, ...

  9. Spring Boot基础:Spring Boot简介与快速搭建(1)

    1. Spring Boot简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的创建.运行.调试.部署等. Spring Boot默认使用tomca ...

  10. Python——Button参数

    anchor:   指定按钮上文本的位置:  background(bg): 指定按钮的背景色:  bitmap:指定按钮上显示的位图:  borderwidth(bd): 指定按钮边框的宽度:  c ...