BZOJ 4408: [Fjoi 2016]神秘数 [主席树]
题意:
一个可重复数字集合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$的数
询问区间?难道用主席树嘛
然后看了下题解 发现的确是主席树,每次$\le now$前缀和看看能不能$+1 \ge now$来更新$now$
复杂度?
之前和现在为$a,b$,下次必定加上$a<\ <b$的数。最多$O(log\sum a)$次
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define lc(x) t[x].l
#define rc(x) t[x].r
typedef long long ll;
const int N=1e5+;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int n,Q,a[N],mp[N],m;
inline void inimp(){
sort(mp+,mp++m);
int p=; mp[++p]=mp[];
for(int i=;i<=m;i++) if(mp[i]!=mp[i-]) mp[++p]=mp[i];
m=p;
}
inline int Bin(int v){
int l=,r=m;
while(l<=r){
int mid=(l+r)>>;
if(v==mp[mid]) return mid;
else if(v<mp[mid]) r=mid-;
else l=mid+;
}
return ;
}
struct Node{
int l,r,sum;
}t[N*];
int root[N],sz;
void fIns(int &x,int l,int r,int p){//printf("ins %d %d %d %d\n",x,l,r,p);
t[++sz]=t[x];x=sz;
t[x].sum+=mp[p];
if(l==r) return;
int mid=(l+r)>>;
if(p<=mid) fIns(lc(x),l,mid,p);
else fIns(rc(x),mid+,r,p);
}
int fQue(int x,int y,int l,int r,int ql,int qr){//printf("que %d %d %d %d %d %d\n",x,y,mp[l],mp[r],ql,qr);if(l==4 && r==4 && qr==8) return 0;
if(qr<mp[l] || ql>mp[r]) return ;
if(ql<=mp[l]&&mp[r]<=qr) return t[y].sum-t[x].sum;
else{
int re=,mid=(l+r)>>;
if(ql<=mp[mid]) re+=fQue(lc(x),lc(y),l,mid,ql,qr);
if(mp[mid]<qr) re+=fQue(rc(x),rc(y),mid+,r,ql,qr);
return re;
}
} int main(){
//freopen("in","r",stdin);
n=read();
for(int i=;i<=n;i++) a[i]=mp[++m]=read();
inimp();
//for(int i=1;i<=n;i++) printf("a %d %d\n",a[i],Bin(a[i]));
for(int i=;i<=n;i++) a[i]=Bin(a[i]),root[i]=root[i-],fIns(root[i],,m,a[i]);//puts("endIns");
Q=read();
while(Q--){
int l=read(),r=read();
int now=;
while(true){
int _=fQue(root[l-],root[r],,m,,now);
if(_<now) break;
else now=_+;
}
printf("%d\n",now);
}
}
BZOJ 4408: [Fjoi 2016]神秘数 [主席树]的更多相关文章
- BZOJ 4408: [Fjoi 2016]神秘数 主席树 + 神题
Code: #include<bits/stdc++.h> #define lson ls[x] #define mid ((l+r)>>1) #define rson rs[ ...
- Bzoj 4408: [Fjoi 2016]神秘数 可持久化线段树,神题
4408: [Fjoi 2016]神秘数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 177 Solved: 128[Submit][Status ...
- BZOJ 4408: [Fjoi 2016]神秘数 可持久化线段树
4408: [Fjoi 2016]神秘数 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4408 Description 一个可重复数字集 ...
- BZOJ 4408: [Fjoi 2016]神秘数
4408: [Fjoi 2016]神秘数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 464 Solved: 281[Submit][Status ...
- bzoj 4408: [Fjoi 2016]神秘数 数学 可持久化线段树 主席树
https://www.lydsy.com/JudgeOnline/problem.php?id=4299 一个可重复数字集合S的神秘数定义为最小的不能被S的子集的和表示的正整数.例如S={1,1,1 ...
- ●BZOJ 4408 [Fjoi 2016]神秘数
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4408 题解: 主席树 首先,对于一些数来说, 如果可以我们可以使得其中的某些数能够拼出 1- ...
- BZOJ4408&4299[Fjoi 2016]神秘数——主席树
题目描述 一个可重复数字集合S的神秘数定义为最小的不能被S的子集的和表示的正整数.例如S={1,1,1,4,13},1 = 1 2 = 1+1 3 = 1+1+1 4 = 4 5 = 4+1 6 = ...
- 【bzoj4408】[Fjoi 2016]神秘数 主席树
题目描述 一个可重复数字集合S的神秘数定义为最小的不能被S的子集的和表示的正整数.例如S={1,1,1,4,13},1 = 12 = 1+13 = 1+1+14 = 45 = 4+16 = 4+1+1 ...
- 4408: [Fjoi 2016]神秘数
4408: [Fjoi 2016]神秘数 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 452 Solved: 273 [Submit][Stat ...
随机推荐
- Winform 控件的入门级使用(一)
开始总结一下控件的基本用法,方便以后查阅. 一.Label Label 的使用频率很高,基本上也没有什么难度. #region Winform //label label.Text = "这 ...
- C++ enum用法小技巧
enum DeviceDataType :int { None = 0, SourceRGBA32 = 1, Keying = ...
- Android 社区App 《窝吧》开源分享
一整个社区模式App的整套代码,包括发布动态,添加.删除好友,添加黑名单,聊天,用户反馈等功能. 相关技术 1 底层使用Bmob后端云,官网: https://www.bmob.cn/ 2 友盟插件, ...
- dig(域信息搜索器)命令
dig命令 dig命令是常用的域名查询工具,可以用来测试域名系统工作是否正常. 语法 dig(选项)(参数) 选项 @<服务器地址>:指定进行域名解析的域名服务器: -b<ip地 ...
- Yourphp 使用说明
https://wenku.baidu.com/view/c8d2e667cc1755270722088a.html 这个是站点的配置信息,比如:网站名称. LOGO .网站标题等 推荐位:个别可能用 ...
- 虚拟主机,VPS,云主机之间的区别?
虚拟主机即共享主机,是利用虚拟技术把一台完整的服务器分成若干个主机,拥有多个网站,共享这台服务器的硬件和带宽的资源.可以托管简单的静态和动态的网站,满足客户最基本的网络托管需求. VPS是将一台物理服 ...
- java基础学习总结——java读取properties文件总结
摘录自:http://www.cnblogs.com/xdp-gacl/p/3640211.html 一.java读取properties文件总结 在java项目中,操作properties文件是经常 ...
- RocketMQ-消费重试机制
介绍: RocketMQ的消息重试及时分为两种,一种是Producer端重试,一种是Consume端重试. 1.Producer端重试 : 1.1消息发没发成功,默认情况下是3次重试. 2.Consu ...
- CentOS 6.3 64位下MySQL5.1.54源码安装配置详解
安装环境:CentOS 6.3 64位 一:先安装依赖包(不然配置的时候会报错的!) yum -y install ncurses* libtermcap* 新建mysql用户 [root@clien ...
- 爬取知名社区技术文章_pipelines_4
获取字段的存储处理和获取普通的路径 #!/usr/bin/python3 # -*- coding: utf-8 -*- import pymysql import gevent import pym ...