博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【洛谷4587】 [FJOI2016]神秘数(主席树)
阅读量:6220 次
发布时间:2019-06-21

本文共 1165 字,大约阅读时间需要 3 分钟。

传送门

然而是权限题

Solution

发现题目给出的一些规律,emm,如果我们新凑出来的一个数,那么后面一个数一定是\(sum+1\)

于是就可以主席树随便维护了!

代码实现

#include
using namespace std;inline int gi(){int x;scanf("%d",&x);return x;}const int N=100010;int rt[N],tot;int n,a[N];struct node{ int ls,rs,val;}t[N*200];void modify(int&x,int l,int r,int pos){ t[++tot]=t[x]; x=tot; t[x].val+=pos; if(l==r)return; int mid=(l+r)>>1; if(pos<=mid)modify(t[x].ls,l,mid,pos); else modify(t[x].rs,mid+1,r,pos);}int query(int x,int y,int l,int r,int pos){ if(l==r)return t[y].val-t[x].val; int mid=(l+r)>>1; if(pos<=mid)return query(t[x].ls,t[y].ls,l,mid,pos); else return query(t[x].rs,t[y].rs,mid+1,r,pos)+t[t[y].ls].val-t[t[x].ls].val;}int main(){ n=gi(); for(int i=1;i<=n;i++)a[i]=gi(); for(int i=1;i<=n;i++) { rt[i]=rt[i-1]; modify(rt[i],1,1e9,a[i]); } int m=gi(); while(m--) { int l=gi(),r=gi(),ans=0; while(ans<1e9) { int sum=query(rt[l-1],rt[r],1,1e9,ans+1); if(sum==ans)break; ans=sum; } printf("%d\n",ans+1); } return 0;}

转载于:https://www.cnblogs.com/mle-world/p/10570915.html

你可能感兴趣的文章
重学前端(9)正则还真要多练
查看>>
MongoDB的复制源oplog
查看>>
五线谱入门(三)
查看>>
原创文章:使用Vuejs实现个人所得税功能兼容移动端
查看>>
HashiCorp:为任何应用程序提供安全和可运行的基础架构
查看>>
面试中经常被问到的 Redis 持久化与恢复
查看>>
好程序员大数据技术分享Zookeeper集群管理与选举
查看>>
Dell-Windows10下装Ubuntu 16.04 双系统,Ubuntu引导开启-经验贴,满干货!
查看>>
说说主流的推送服务
查看>>
加密狗只是开始,区块链+文娱才是大趋势
查看>>
一个vue-cli创建项目webpack相关都配置合简介
查看>>
Zookeeper源码分析-Zookeeper Server启动分析
查看>>
ES6 学习笔记 - 字符串
查看>>
支付宝SDK下载地址
查看>>
iOS 动画七:Layer Animations
查看>>
[译]如何通过7个简单步骤保护您的Linux服务器
查看>>
建站过程实录
查看>>
markdown-掘金编辑器语法2018
查看>>
写给产品经理的12封信(第06封):时间管理
查看>>
从0到1,小白的前端摸索之路
查看>>