「FJOI2016」神秘数 解题报告
「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」神秘数 解题报告的更多相关文章
- @loj - 2174@ 「FJOI2016」神秘数
目录 @description@ @solution@ @accepted code@ @details@ @description@ 一个可重复数字集合 S 的神秘数定义为最小的不能被 S 的子集的 ...
- 【LOJ】#2174. 「FJOI2016」神秘数
题解 这道题的结论很显然= = 就是暴力求的话,把一个区间的数排一下序,如果当前这个数大于前面所有数的前缀和+1,那么前缀和+1即我们所求的答案 那么我们设置一个当前答案(初始为1),在主席树上求出来 ...
- loj2174 「FJOI2016」神秘数
先考虑一下一个集合怎么用 \(O(n)\) 时间求出来,然后用主席树推广到一个序列就可以了.大致思想就是考虑一个数的权值和它前面的数的和的关系. #include <algorithm> ...
- 「NOI2015」寿司晚宴 解题报告
「NOI2015」寿司晚宴 这个题思路其实挺自然的,但是我太傻了...最开始想着钦定一些,结果发现假了.. 首先一个比较套路的事情是状压前8个质数,后面的只会在一个数出现一次的再想办法就好. 然后发现 ...
- 「ZJOI2016」大森林 解题报告
「ZJOI2016」大森林 神仙题... 很显然线段树搞不了 考虑离线操作 我们只搞一颗树,从位置1一直往后移动,然后维护它的形态试试 显然操作0,1都可以拆成差分的形式,就是加入和删除 因为保证了操 ...
- 「SCOI2016」背单词 解题报告
「SCOI2016」背单词 出题人sb 题意有毒 大概是告诉你,你给一堆n个单词安排顺序 如果当前位置为x 当前单词的后缀没在这堆单词出现过,代价x 这里的后缀是原意,但不算自己,举个例子比如abc的 ...
- 「SCOI2015」国旗计划 解题报告
「SCOI2015」国旗计划 蛮有趣的一个题 注意到区间互不交错,那么如果我们已经钦定了一个区间,它选择的下一个区间是唯一的,就是和它有交且右端点在最右边的,这个可以单调队列预处理一下 然后往后面跳拿 ...
- 「JLOI2015」骗我呢 解题报告?
「JLOI2015」骗我呢 这什么神仙题 \[\color{purple}{Link}\] 可以学到的东西 对越过直线的东西翻折进行容斥 之类的..吧? Code: #include <cstd ...
- 「JLOI2015」城池攻占 解题报告
「JLOI2015」城池攻占 注意到任意两个人的战斗力相对大小的不变的 可以离线的把所有人赛到初始点的堆里 然后做启发式合并就可以了 Code: #include <cstdio> #in ...
随机推荐
- 开发工具之Sublime编辑器
sublime是一款轻量级的编辑器,可以从官网上进行下载最新版本.它有很多使用并且强大的功能支持.例如:GOTO,package 等快捷操作.但有时候下载的版本不能进行安装package contro ...
- IdentityServer4【Introduction】之支持的规范
支持的规范 identityserver实现了下面的规范 OpenID Connect OpenID Connect Core 1.0 (spec) OpenID Connect Discovery ...
- Html5使用canvas作图线宽很粗
自己使用canvas画图是碰到的问题,在这里记录一下.我把lineWidth设置为1,但是很粗,而且发虚.代码如下: <script type="text/javascript&quo ...
- easyUI定区关联快递员js代码
easyUI定区关联快递员js代码: <script type="text/javascript"> $.fn.serializeJson=function(){ va ...
- AngularJS基于MVC的复杂操作案例
AngularJS基于MVC的复杂操作案例 <!DOCTYPE html> <html> <head> <meta charset="UTF-8&q ...
- flutter中使用svg
dependencies: flutter_svg: ^0.12.1 flutter packages get import 'package:flutter_svg/flutter_svg.dart ...
- 4面向对象(OOP)
学习线路 初学: 熟悉语法 进阶: 1.23种设计模式 2.6中开发原则 高级: 1.优化 2.架构 3.安全 概念 类:一类具有相同特性的事物的抽象描述,用一个java类表示. 成员变量:抽取的属性 ...
- VMware与CentOS的安装与Linux简单指令
一 . VMware与CentOS系统安装 下载CentOS系统的ISO镜像 # 官方网站,国外网站,下载速度会很慢 www.centos.org # 由于国外的下载速度慢,我们可以使用国内的镜像源 ...
- 开发中遇到的css兼容问题
1. overflow: scroll(平台兼容) 在Mac中的Chrome浏览器中,内容不超过容器时不会出现滚动条: 在Wins中的Chorme浏览器中,内容不超过容器时也会出现滚动条. 解决方法: ...
- vs code軟件操作
https://www.imooc.com/article/39349 https://www.html.cn/archives/8144