「FJOI2016」神秘数

这题不sb,我挺sb的...

我连不带区间的都不会哇

考虑给你一个整数集,如何求这个神秘数

这有点像一个01背包,复杂度和值域有关。但是你发现01背包可以求出更多的东西,就是每个值是否可以被表示,而这个问题有点像问你一个单点的是否可以被表示,这是它的特殊性。

我们把这个整数集排序后,假设当前表示的区间是\([1,x]\),这时候在线加入\(a\)

如果\(a\le x\),显然值域变成\([1,x+a]\),否则答案假设\(x+1\)

考虑如何优化这个过程,我们可不可以一次加入很多个数字呢?

如果当前的区间是\([1,x]\),然后之前加的一个值是\(las\),那么值域在\([las+1,a+1]\)的值都是可以加入的,那么我们不妨一起把它们加入,并把\(x\)变成它们的和+1

这时候下一个要加入的值的值域至少是\(2*las\),所以操作次数是\(\log\)的

然后我们发现支持一个区间中某个值域的数的和,直接主席树就可以了

复杂度\(O(n\log n\log \sum a)\)


Code:

#include <cstdio>
#include <cctype>
template <class T>
void read(T &x)
{
x=0;char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) x=x*10+c-'0',c=getchar();
}
const int N=1e5+10;
const int inf=1e9;
int a[N],n,m;
int ch[N*90][2],sum[N*90],root[N],tot;
#define ls ch[now][0]
#define rs ch[now][1]
#define ols ch[las][0]
#define ors ch[las][1]
#define koito_yuu 233
void change(int las,int &now,int l,int r,int p)
{
now=++tot;
if(l==r){sum[now]=sum[las]+p;return;}
int mid=l+r>>1;
if(p<=mid) change(ols,ls,l,mid,p),rs=ors;
else ls=ols,change(ors,rs,mid+1,r,p);
sum[now]=sum[ls]+sum[rs];
}
int query(int now,int las,int l,int r,int p)
{
if(r<=p) return sum[now]-sum[las];
int mid=l+r>>1;
if(p<=mid) return query(ls,ols,l,mid,p);
else return sum[ls]-sum[ols]+query(rs,ors,mid+1,r,p);
}
int main()
{
read(n);
for(int i=1;i<=n;i++) read(a[i]),change(root[i-1],root[i],1,inf,a[i]);
read(m);
for(int l,r,ans,i=1;i<=m;i++)
{
read(l),read(r),ans=1;
while(koito_yuu)
{
int sum=query(root[r],root[l-1],1,inf,ans);
if(sum<ans) break;
else ans=sum+1;
}
printf("%d\n",ans);
}
return 0;
}

2019.3.12

「FJOI2016」神秘数 解题报告的更多相关文章

  1. @loj - 2174@ 「FJOI2016」神秘数

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 一个可重复数字集合 S 的神秘数定义为最小的不能被 S 的子集的 ...

  2. 【LOJ】#2174. 「FJOI2016」神秘数

    题解 这道题的结论很显然= = 就是暴力求的话,把一个区间的数排一下序,如果当前这个数大于前面所有数的前缀和+1,那么前缀和+1即我们所求的答案 那么我们设置一个当前答案(初始为1),在主席树上求出来 ...

  3. loj2174 「FJOI2016」神秘数

    先考虑一下一个集合怎么用 \(O(n)\) 时间求出来,然后用主席树推广到一个序列就可以了.大致思想就是考虑一个数的权值和它前面的数的和的关系. #include <algorithm> ...

  4. 「NOI2015」寿司晚宴 解题报告

    「NOI2015」寿司晚宴 这个题思路其实挺自然的,但是我太傻了...最开始想着钦定一些,结果发现假了.. 首先一个比较套路的事情是状压前8个质数,后面的只会在一个数出现一次的再想办法就好. 然后发现 ...

  5. 「ZJOI2016」大森林 解题报告

    「ZJOI2016」大森林 神仙题... 很显然线段树搞不了 考虑离线操作 我们只搞一颗树,从位置1一直往后移动,然后维护它的形态试试 显然操作0,1都可以拆成差分的形式,就是加入和删除 因为保证了操 ...

  6. 「SCOI2016」背单词 解题报告

    「SCOI2016」背单词 出题人sb 题意有毒 大概是告诉你,你给一堆n个单词安排顺序 如果当前位置为x 当前单词的后缀没在这堆单词出现过,代价x 这里的后缀是原意,但不算自己,举个例子比如abc的 ...

  7. 「SCOI2015」国旗计划 解题报告

    「SCOI2015」国旗计划 蛮有趣的一个题 注意到区间互不交错,那么如果我们已经钦定了一个区间,它选择的下一个区间是唯一的,就是和它有交且右端点在最右边的,这个可以单调队列预处理一下 然后往后面跳拿 ...

  8. 「JLOI2015」骗我呢 解题报告?

    「JLOI2015」骗我呢 这什么神仙题 \[\color{purple}{Link}\] 可以学到的东西 对越过直线的东西翻折进行容斥 之类的..吧? Code: #include <cstd ...

  9. 「JLOI2015」城池攻占 解题报告

    「JLOI2015」城池攻占 注意到任意两个人的战斗力相对大小的不变的 可以离线的把所有人赛到初始点的堆里 然后做启发式合并就可以了 Code: #include <cstdio> #in ...

随机推荐

  1. 使用junit测试

    package creeper; import java.util.Scanner; public class size { private static int intercePosition = ...

  2. myecplise ssh项目配置上遇到的问题

    版本:spring3.1+hib4.1+struts2.1 学习项目使用此版本运行时,总是会遇到各样的错误,在这里做一下记录. 问题1:log4j相关 spring的web项目,执行时报错: 信息: ...

  3. node path

    1.path.basename(path[, ext]) ● path <string> ● ext <string> An optional file extension ● ...

  4. IdentityServer4【Topic】之确认(Consent)

    Consent 确认 在授权请求期间,如果身份服务器需要用户同意,浏览器将被重定向到同意页面.也就是说,确认也算是IdentityServer中的一个动作.确认这个词直接翻译过来有一些古怪,既然大家都 ...

  5. php 对象赋值后改变成员变量影响赋值对象

    话不多说看代码 打印结果 对obj1的操作 直接影响了obj2 , 对obj2的操作 直接影响了obj1

  6. js 解决中文乱码的问题

    1.对象 request response 对象setCharacterEncoding=UTF-8 1 <%@ page language="java" contentTy ...

  7. Hbase API

  8. python学习笔记(7)--循环语句

    循环语句如下: for i in range(start, end): //注意 前闭后开 coding for i in range(m,n,k): coding for c in s: codin ...

  9. WPF 将数据源绑定到TreeView控件出现界面卡死的情况

    首先来谈一下实现将自定义的类TreeMode绑定到TreeView控件上的一个基本的思路,由于每一个节点都要包含很多自定义的一些属性信息,因此我们需要将该类TreeMode进行封装,TreeView的 ...

  10. java 静态成员访问

    public class MqConfig { @Getter private static IProducerProcessor callBackProducerRetry; @Getter @Va ...