主席树+脑洞

首先我们有一个结论:如果我们已经凑出1-n,那么下一个数必须小于等于n+1才能凑出n+1,否则结束。

那么如果只有一次询问,我们把数组排序,然后扫一遍看每个数当前能不能加入。但是多组询问就不行了,这是我们就要用主席树。

主席树是权值线段树,我们维护区间和,但是我们不能扫一遍,就得进一步优化。

我们发现每次我们找<=n+1的数的和必须>上一次的结果才满足,否则退出,那么我们构造一个最小,发现是斐波那契数列,就是logn,每次主席树查找权值和就行了。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = ;
int n, m, cnt, lim;
int lc[N], rc[N], root[N], x[N];
ll sum[N];
void update(int l, int r, int last, int &x, int pos)
{
x = ++cnt;
sum[x] = sum[last] + pos;
if(l == r) return;
int mid = (l + r) >> ;
lc[x] = lc[last];
rc[x] = rc[last];
if(pos <= mid) update(l, mid, lc[last], lc[x], pos);
else update(mid + , r, rc[last], rc[x], pos);
}
ll query(int l, int r, int x, int y, int k)
{
if(l == r)
{
if(k >= l) return sum[y] - sum[x];
else return ;
}
int mid = (l + r) >> ;
if(k <= mid) return query(l, mid, lc[x], lc[y], k);
else return sum[lc[y]] - sum[lc[x]] + query(mid + , r, rc[x], rc[y], k);
}
void build(int l, int r, int &x)
{
if(l > r) return;
x = ++cnt;
if(l == r) return;
int mid = (l + r) >> ;
build(l, mid - , lc[x]);
build(mid + , r, rc[x]);
}
int main()
{
scanf("%d", &n);
build(, n, root[]);
for(int i = ; i <= n; ++i)
{
scanf("%d", &x[i]); lim = max(lim, x[i]);
}
for(int i = ; i <= n; ++i)
update(, lim, root[i - ], root[i], x[i]);
scanf("%d", &m);
while(m--)
{
int l, r; ll S = ; scanf("%d%d", &l, &r);
for(; ;)
{
ll t = query(, lim, root[l - ], root[r], S);
if(t == S - )
break;
else
S = t + ;
}
printf("%lld\n", S);
}
return ;
}

最新文章

  1. DedeCMS使用方法----如何将网站上传到服务器
  2. Hadoop op 1)
  3. springboot使用之一:连接生产数据库,添加连接池
  4. HBase初探
  5. 01什么是ExtJs?
  6. android layout_weight 使用总结
  7. ElasticSearch Remote Code Execution (CVE-2014-3120)
  8. Android Camera
  9. Windows XP下安装WinCE6.0开发环境
  10. PHPUnit测试
  11. Java 八大类型、String和 StringBuffer
  12. (转)OGNL表达式介绍
  13. django(注册→登录→主页)增强版
  14. 带你深入理解STL之Stack和Queue
  15. Python RabbitMQ消息持久化
  16. php算法,冒泡排序
  17. LINUX7安装Oracle11g单实例小结
  18. 大数据技术之_16_Scala学习_02_变量
  19. GPU对数据的操作不可累加
  20. PHP session用redis存储

热门文章

  1. react 中样式私有
  2. eBPF监控工具bcc系列五工具funccount
  3. xmpp使用经验
  4. P1036 选数(DFS)
  5. 微信小程序 setData动态修改数据数组的值
  6. 每日命令:(1)ls
  7. Springboot 添加数据源报错
  8. java,有用的代码片段
  9. [luoguP1417] 烹调方案(背包DP)
  10. Cocoa -- 添加和移除开机启动项