题意:给出1e5个数 查询l,r区间内第一个不能被表示的数 比如1,2,4可以用子集的和表示出[1,7] 所以第一个不能被表示的是8 题解:先考虑暴力的做法 把这个区间内的数字按从小到大排序后 从前往后扫 当前能表示出[1,x] 假设第i个数字y-1<=x 那么就可以表示[1,x+y] 如果y > x + 1那么第一个不能表示出的数字就是x+1 我们根据这个性质来想 假如当前区间能表示出[1,x] 我们计算这个区间内所有比x小的数的和tmp 如果tmp>x 那么我们显然可以表示出[1,t…
传送门 解题思路 如果区间内没有\(1\),那么答案就为\(1\),从这一点继续归纳.如果区间内有\(x\)个\(1\),设区间内\([2,x+1]\)的和为\(sum\),如果\(sum=0\),那么答案为\(x+1\),否则\([1,x+sum]\)中的所有数字一定可以被表示,然后这个操作每次使答案至少扩大\(1\)倍,再用一个主席树维护,时间复杂度\(O(nlognlogA)\) 代码 #include<iostream> #include<cstdio> #include&…
明白之后 5min 就写好了-自闭- 这题的题意是问你 \([L,R]\) 区间的数字不能构成的数字的最小值- 首先考虑 如果 \([1,x]\) 可以被表示 那么加入一个 \(a_i\) 显然 \([1,x+a_i]\) 都可以被表示 有什么好办法呢 当然有 \(O(q * \sum_{i\in[L,R]}{a_i}*[R-L+1])\) (雾) 区间求和问题啥的考虑主席树,首先我不会证明复杂度,是因为我菜/kk 还是一样的套路 讨论 \([1,x]\) 对于区间求 \(\sum_{i\in[…
(bzoj4408)[FJOI2016]神秘数(可持久化线段树) bzoj luogu 对于一个区间的数,排序之后从左到右每一个数扫 如果扫到某个数a时已经证明了前面的数能表示[1,x],那么分情况: a>x+1,不能继续表示下去,答案就是x+1 否则表示区间变为[1,x+a]. 用主席树上二分优化这个过程. 1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 const int N=100069…
题目描述 一个可重复数字集合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](l<=r),求由a[l],a[l+1],…,a[r]所构成的可重复数字集合的神秘数. 输入 第一行一个整数n,表示数字个数. 第二…
题目描述 一个可重复数字集合S的神秘数定义为最小的不能被S的子集的和表示的正整数.例如S={1,1,1,4,13},1 = 12 = 1+13 = 1+1+14 = 45 = 4+16 = 4+1+17 = 4+1+1+18无法表示为集合S的子集的和,故集合S的神秘数为8.现给定n个正整数a[1]..a[n],m个询问,每次询问给定一个区间[l,r](l<=r),求由a[l],a[l+1],…,a[r]所构成的可重复数字集合的神秘数. 输入 第一行一个整数n,表示数字个数.第二行n个整数,从1编…
Description 一个可重复数字集合$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](l\;\leq\;r)$,求由$a[l],a[l+1],-…
传送门 题意: 一个可重复数字集合S的神秘数定义为最小的不能被S的子集的和表示的正整数.例如S={1,1,1,4,13},8无法表示为集合S的子集的和,故集合S的神秘数为8.现给定n个正整数a[1]..a[n],m个询问,每次询问给定一个区间[l,r](l<=r),求由a[l],a[l+1],…,a[r]所构成的可重复数字集合的神秘数. 咦,神秘数好熟悉啊 最优集合? 那么如何求神秘数就很清楚了,当前$now$,就找$\le now+1$的数 询问区间?难道用主席树嘛 然后看了下题解 发现的确是…
Description \(n\) 个数的序列,每次询问一个区间,求最小的一个数使得不能用这个区间中的数之和表示. \(n \leq 10^5, \sum a_i \leq 10^9\) 这两个题一个是权限一个没有真是很方所以我在洛谷交 Solution 第一次用数组写数据结构真短啊 考虑只有一次询问怎么做 把给定的区间内的数排序,从小到大扫一遍. 如果一个数比他之前的数之和至少大了 \(1\) ,那么答案就是和 + 1 否则就可以把\([1,\text{前缀和}]\) 都表示出来(感性理解很容…
Code: #include<bits/stdc++.h> #define lson ls[x] #define mid ((l+r)>>1) #define rson rs[x] #define maxn 300003 #define inf 1000000001 #define setIO(s) freopen(s".in","r",stdin) using namespace std; int cnt; int ls[maxn*20],…