【LG4587】[FJOI2016]神秘数

题面

洛谷

题解

首先我们想一想暴力怎么做

对于一段区间\([l,r]\)

我们先将它之间的数升序排序

从左往右扫,

设当前我们可以表示出的数为\([1,x]\),待插入的数为\(a_i\)

会有下面两种情况:

1.\(a_i> x+1\)时,\(x+1\)肯定表示不出来\(ans=x+1\)

2.\(a_i\leq x+1\)时,值域变为\([1,x+a_i]\),继续扫

那么我们暴力的复杂度为\(O(nmlogn)\)

考虑怎么优化这个过程

还是用刚才的思路

设当前值域\([1,x]\)

则\(ans=x+1\)

若小于等于\(ans\)的数的和\(res\geq ans\),则一定有未选的且小于等于\(ans\)的数,

令\(ans=res+1\)即可。

反之说明答案就是\(ans\),直接\(break\)

因为有\(\sum a_i\leq 10^9\),用主席树维护

所以复杂度\(O(m(logn)(log\sum a_i))\)

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
inline int gi() {
register int data = 0, w = 1;
register char ch = 0;
while (!isdigit(ch) && ch != '-') ch = getchar();
if (ch == '-') w = -1, ch = getchar();
while (isdigit(ch)) data = 10 * data + ch - '0', ch = getchar();
return w * data;
}
const int MAX_N = 1e5 + 5;
const int INF = 1e9;
struct Node { int ls, rs, v; } t[MAX_N << 5];
int rt[MAX_N], tot = 0;
void insert(int &o, int p, int l, int r, int pos, int v) {
o = ++tot, t[o] = t[p], t[o].v += v;
if (l == r) return ;
int mid = (l + r) >> 1;
if (pos <= mid) insert(t[o].ls, t[p].ls, l, mid, pos, v);
else insert(t[o].rs, t[p].rs, mid + 1, r, pos, v);
}
int query(int v, int u, int l, int r, int ql, int qr) {
if (ql <= l && r <= qr) return t[u].v - t[v].v;
int mid = (l + r) >> 1, res = 0;
if (ql <= mid) res += query(t[v].ls, t[u].ls, l, mid, ql, qr);
if (qr > mid) res += query(t[v].rs, t[u].rs, mid + 1, r, ql, qr);
return res;
}
int N, a[MAX_N];
int main () {
N = gi(); for (int i = 1; i <= N; i++) a[i] = gi();
for (int i = 1; i <= N; i++) insert(rt[i], rt[i - 1], 1, INF, a[i], a[i]);
int M = gi();
while (M--) {
int l = gi(), r = gi(), ans = 1;
for (;;) {
int res = query(rt[l - 1], rt[r], 1, INF, 1, ans);
if (res >= ans) ans = res + 1;
else break;
}
printf("%d\n", ans);
}
return 0;
}

【LG4587】[FJOI2016]神秘数的更多相关文章

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

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

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

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

  3. [bzoj4408][Fjoi2016]神秘数

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

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

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

  5. Luogu P4587 [FJOI2016]神秘数

    一道好冷门的好题啊,算是对于一个小结论和数据结构的一点考验吧 首先看完题目我们发现要从这个神秘数的性质入手,我们观察or手玩可得: 如果有\(x\)个\(1\),那么\([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. BZOJ 4408 FJOI2016 神秘数 可持久化线段树

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

  8. 洛谷 P4587 [FJOI2016]神秘数

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

  9. Luogu4587 [FJOI2016]神秘数

    题目大意:给定一个长度为$n$的正整数序列$a_i$,$m$次询问,每次询问$[l,r]$,求最小的无法表示成$a_l,a_{l+1},\ldots,a_r$的子集之和的正整数. 数据范围:$1\le ...

随机推荐

  1. c++ 派生类的构造函数次序

    #include <iostream> using namespace std; class CFatherSum //父类Sum { public: CFatherSum(int iRe ...

  2. 超慢速移动动画使用CSS3实现流畅效果

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVpbGVpZm9yZXZlcg==/font/5a6L5L2T/fontsize/400/fill/I0 ...

  3. 应用层-Http/Https

    应用层-Http/Https 一.Http 1. 1.1 2. 2.1 3.2 1. 1.1 2. 2.1 3.2 1. 1.1 2. 2.1 3.2 二.Https 1. 1.1 2. 2.1 3. ...

  4. 简单属性margin和padding

    关于margin属性的介绍 margin:20px 上 右 下 左 都是20px margin:20px 40 px 上 下 20px 左 右 40px margin:20px 40px  60px ...

  5. virtualbox+vagrant学习-4-Vagrantfile-7-WinRM Settings

    WinRM Settings 配置命名空间config.winrm config.winrm配置与如何通过winrm配置vagrant访问你的Windows客户相关.与大多数vagrant设置一样,默 ...

  6. browserify文件后函数调用报is not defined的原因

    举个例子: a.js ; module.exports.a = a; b.js var result = require('./a'); var getA =() => { console.lo ...

  7. PHP面试系列 之框架(一)---- MVC框架基本工作原理

    题:谈谈你对MVC的认识,介绍集中目前比较流行的MVC框架 考点: (1)MVC工作原理 (2)常见MVC框架 延伸: (1)单一入口的工作原理 (2)模板引擎的理解 (1)MVC工作原理 Model ...

  8. CodeForces - 999D Equalize the Remainders (模拟+set)

    You are given an array consisting of nn integers a1,a2,…,ana1,a2,…,an , and a positive integer mm . ...

  9. .NET Core中基类可以反射子类的成员

    我们定义一个类DemoA,再定义一个类DemoB继承DemoA.当构造一个DemoB类对象后,我们可以通过其调用基类DemoA中的方法来反射子类DemoB的成员. 新建一个.NET Core控制台项目 ...

  10. 算法-求两个有序数组两两相加的值最小的K个数

    我的思路是: 用队列,  从(0,0)開始入队,每次出队的时候,选(1,0) (0,1) 之间最小的入队,假设是相等的都入队,假设入过队的就不入了,把出队的k个不同的输出来就可以 我測试了几组数据都是 ...