浅谈主席树:https://www.cnblogs.com/AKMer/p/9956734.html

题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=4408

我们先把问题简化,给你一个可重集,求最小的不能被凑出来的正整数。

性质一:假设原集合可以把\([1,num]\)全部凑出来,新加入一个数字\(x\),就可以凑出\([1,num+x]\)

证明:显然。

性质二:如果你已经可以凑出\([1,num_1]\),当前集合里权值在\([1,num_1]\)里的所有数的权值和为\(num_2\),那么你就可以凑出\([1,num_2]\)。

证明:因为性质一。

性质三:如果你由\([1,num_1]\)得到了\([1,num_2]\)且\(num_2>num_1\),然后由\([1,num_2]\)得到了\([1,num_3]\)且\(num_3> num_2\),那么\(num_3\geqslant2*num_1\)。

证明:因为由\(num_2\)转到\(num_3\),增加的数字必然在\([num_1,num_2]\)内,所以\(num_3\geqslant num_1+num_1\)。

因为这两条性质,我们可以将最小的不能凑出的数不断变大,而且是成倍增长的。先钦点不能凑出的数字为\(1\),然后根据性质二不断变大,时间是\(60*logn\)的。

时间复杂度:\(O(60*mlogn)\)

空间复杂度:\(O(nlogn)\)

代码如下:

#include <cstdio>
using namespace std; const int maxn=1e5+5; int n,m,sum;
int a[maxn],rt[maxn]; int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
} struct tree_node {
int sum,cnt,ls,rs;
}; struct chairman_tree {
int tot;
tree_node tree[maxn*35]; void ins(int lst,int &now,int l,int r,int pos) {
now=++tot;tree[now]=tree[lst];
tree[now].cnt++;tree[now].sum+=pos;
if(l==r)return;
int mid=(l+r)>>1;
if(pos<=mid)ins(tree[lst].ls,tree[now].ls,l,mid,pos);
else ins(tree[lst].rs,tree[now].rs,mid+1,r,pos);
} int query(int x,int y,int l,int r,int pos) {
if(r<=pos)return tree[y].sum-tree[x].sum;
int mid=(l+r)>>1,res=tree[tree[y].ls].sum-tree[tree[x].ls].sum;
if(pos<=mid)res=query(tree[x].ls,tree[y].ls,l,mid,pos);
else res+=query(tree[x].rs,tree[y].rs,mid+1,r,pos);
return res;
}
}T; int main() {
n=read();
for(int i=1;i<=n;i++) {
a[i]=read();sum+=a[i];
}
for(int i=1;i<=n;i++)
T.ins(rt[i-1],rt[i],1,sum,a[i]);
m=read();
for(int i=1;i<=m;i++) {
int l=read(),r=read(),cnt=1;
while(cnt<sum) {
int tmp=T.query(rt[l-1],rt[r],1,sum,cnt);
if(tmp<cnt)break; else cnt=tmp+1;//cnt就是题解里讲的num
}
printf("%d\n",cnt);
}
return 0;
}

BZOJ4408:[FJOI2016]神秘数的更多相关文章

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

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

  2. [bzoj4408][Fjoi2016]神秘数

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

  3. 题解【bzoj4587 & bzoj4408 [FJOI2016]神秘数】

    Description \(n\) 个数的序列,每次询问一个区间,求最小的一个数使得不能用这个区间中的数之和表示. \(n \leq 10^5, \sum a_i \leq 10^9\) 这两个题一个 ...

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

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

  5. 【LG4587】[FJOI2016]神秘数

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

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

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

  7. [FJOI2016]神秘数(脑洞+可持久化)

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

  8. Luogu P4587 [FJOI2016]神秘数

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

  9. 【BZOJ-4408】神秘数 可持久化线段树

    4408: [Fjoi 2016]神秘数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 475  Solved: 287[Submit][Status ...

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

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

随机推荐

  1. git是一种分布式代码管理工具,git通过树的形式记录文件的更改历史,比如: base'<--base<--A<--A' ^ | --- B<--B' 小米工程师常常需要寻找两个分支最近的分割点,即base.假设git 树是多叉树,请实现一个算法,计算git树上任意两点的最近分割点。 (假设git树节点数为n,用邻接矩阵的形式表示git树:字符串数组matrix包含n个字符串,每个字符串由字符'0

    // ConsoleApplication10.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream& ...

  2. kernel&uboot学习笔记

    uboot kernel uboot 1.Uboot编译流程分析: uboot是如何编译生成的? 2.根据include/configs/$(target).h可以生成include/autoconf ...

  3. java 发展简史

    [0]README 0.1) 本文转自 core java volume 1,仅供了解Java 的发展历史,它的前世今生,所谓知己知彼,百战不殆(just a joke) : [1]java 发展简史 ...

  4. Ubuntu64位安装Adobe Reader 9.5.5

    Aodbe Reader在Linux下的效果比Foxit Reader(福昕阅读器)要好一些,尤其对于中文文档而言.本文介绍Adobe Reader在Ubuntu下的安装,文章<Ubuntu12 ...

  5. JS基础知识再整理..........不断更新中

    1.JS的五种基本数据类型:字符串.数值.布尔.null.underfined. 2.在JS中,字符串.数值.布尔三种数据类型,有其属性和方法: 3.字符串的三种常用方法[.indexof()..su ...

  6. Neural Task Programming: Learning to Generalize Across Hierarchical Tasks

    Neural Task Programming: Learning to Generalize Across Hierarchical Tasks

  7. Jaccard Similarity and Shingling

    https://www.cs.utah.edu/~jeffp/teaching/cs5955/L4-Jaccard+Shingle.pdf https://www.cs.utah.edu/~jeffp ...

  8. Qt中的通用模板算法QtAlgorithms(qDeleteAll,qBinaryFind,qCountLeadingZeroBits,qPopulationCount,qFill,qSwap,qSort)

    Qt在<QtAlgorithms>头文件中为我们提供了一系列的全局模板方法,这些模板方法主要用于容器操作,比如qDeleteAll().其在Qt中的声明如下: void qDeleteAl ...

  9. 【题解】DZY Loves Chinese

    [题解]DZY Loves Chinese II 不吐槽这题面了... 考虑如何维护图的连通性,如果把图的变成一颗的\(dfs\)生成树,那么如果把一个节点的父边和他接下来所有的返祖边删除,那么我们就 ...

  10. smartforms 二维码打印

    1. 安装TBarCode_SAPwin软件 1) 下载Barcode软件  下载TBarCode_SAPwin 软件.(如需生成SAP"字符控制序列"则需一并下载TBarCode ...