题目链接:https://www.luogu.org/problemnew/show/P1801

替罪羊树吼啊!

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define il inline
using namespace std;
const int maxn = 2000001;
const int alpha = 0.7;
struct scapegoat{
int son[2], val, valid, below;
bool del;
}e[maxn];
int cur[maxn], memory[maxn], root, pool, posi, cnt, to_rebuild, a[maxn], u[maxn], n, m;
il bool isbad(int now)
{
if((double)e[now].valid*alpha <= (double)max(e[e[now].son[0]].valid, e[e[now].son[1]].valid)) return true;
return false;
}
void dfs(int now)
{
if(!now) return;
dfs(e[now].son[0]);
if(e[now].del) cur[++posi] = now;
else memory[++pool] = now;
dfs(e[now].son[1]);
}
void build(int l, int r, int &now)
{
int mid = l+r>>1;
now = cur[mid];
if(l == r)
{
e[now].son[0] = e[now].son[1] = 0;
e[now].valid = e[now].below = 1;
return;
}
if(l < mid) build(l,mid-1,e[now].son[0]);
else e[now].son[0] = 0;
build(mid+1, r, e[now].son[1]);
e[now].below = e[e[now].son[0]].below+e[e[now].son[1]].below+1;
e[now].valid = e[e[now].son[0]].valid+e[e[now].son[1]].valid+1;
}
il void rebuild(int &now)
{
posi = 0;
dfs(now);
if(posi) build(1,posi,now);
else now = 0;
}
il int find_rank(int tar)
{
int now = root;
int ans = 1;
while(now)
{
if(e[now].val >= tar) now = e[now].son[0];
else
{
ans+=e[e[now].son[0]].valid+e[now].del;
now = e[now].son[1];
}
}
return ans;
}
void insert(int &now, int val)
{
if(!now)
{
now = memory[pool--]; e[now].val = val;
e[now].below = e[now].valid = e[now].del = 1;
e[now].son[0] = e[now].son[1] = 0;
return;
}
e[now].below++, e[now].valid++;
if(e[now].val >= val) insert(e[now].son[0], val);
else insert(e[now].son[1], val);
if(!isbad(now))
{
if(to_rebuild)
{
if(e[now].son[0] == to_rebuild) rebuild(e[now].son[0]);
else rebuild(e[now].son[1]);
to_rebuild = 0;
}
}
else to_rebuild = now;
}
void delete_pos(int &now, int tar)
{
if(e[now].del && e[e[now].son[0]].valid + 1 == tar)
{
e[now].del = false; e[now].valid--; return;
}
e[now].valid--;
if(e[e[now].son[0]].valid+e[now].del >= tar) delete_pos(e[now].son[0],tar);
else delete_pos(e[now].son[1], tar-e[e[now].son[0]].valid-e[now].del);
}
il void delete_val(int tar)
{
delete_pos(root, find_rank(tar));
if((double)e[root].below*alpha > e[root].valid) rebuild(root);
}
il int kth(int tar)
{
int now = root;
while(now)
{
if(e[now].del&&e[e[now].son[0]].valid+1==tar) return e[now].val;
else if(e[e[now].son[0]].valid >= tar) now = e[now].son[0];
else
{
tar-=e[e[now].son[0]].valid+e[now].del;
now = e[now].son[1];
}
}
}
int main()
{
root = 0;
for(int i = 2000000; i >= 1; i--)
memory[++pool] = i;
scanf("%d%d",&n,&m);
for(int i = 1; i <= n; i++) scanf("%d",&a[i]);
for(int i = 1; i <= m; i++) scanf("%d",&u[i]);
int qaq = 1; for(int i = 1; i <= m; i++)
{
while(qaq <= u[i])
{
insert(root, a[qaq]);
qaq++;
}
printf("%d\n",kth(i));
}
return 0;
}

【luogu P1801 黑匣子_NOI导刊2010提高(06)】 题解的更多相关文章

  1. Luogu P1801 黑匣子_NOI导刊2010提高(06)

    P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ...

  2. P1801 黑匣子_NOI导刊2010提高(06)

    P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ...

  3. 洛谷 P1801 黑匣子_NOI导刊2010提高(06)(未完)

    P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ...

  4. 【洛谷】【堆】P1801 黑匣子_NOI导刊2010提高(06)

    [题目描述:] Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个Black Box要处理一串命令. 命令只有两 ...

  5. [洛谷P1801]黑匣子_NOI导刊2010提高(06)

    题目大意:两个操作:向一个可重集中加入一个元素:询问第$k$大的数($k$为之前询问的个数加一) 题解:离散化,权值线段树直接查询 卡点:无 C++ Code: #include <cstdio ...

  6. 洛谷 P1801 黑匣子_NOI导刊2010提高(06)

    题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个Black Box要处理一串命令. 命令只有两种: ...

  7. 洛谷 P1801 黑匣子_NOI导刊2010提高(06) 题解

    昨晚恶补了一下二叉堆的内容 然后就找了几个二叉堆的题来做awa 然后发现用二叉堆做这题复杂度是O(nlogn) 但是有O(n)的解法 (某大佬这么说) 思路大概就是: 利用一个大根堆一个小根堆来维护第 ...

  8. luogu P1801 【黑匣子_NOI导刊2010提高(06)】

    这里提供一个简单实现新思路: . 约定: 以下n指代的数的数量,不是题目所指的n 以下m指代询问的数量,不是题目所指的m (不好意思,这是本人习惯) 分块+堆 **堆一次只能输出堆顶的一个元素,如果我 ...

  9. 题解 P1801 【黑匣子_NOI导刊2010提高(06)】

    蒟蒻来发题解了.我仔细看了一下其他题解,各位巨佬用了堆,红黑树,splay,treap之类的强大算法,表示蒟蒻的我只会口胡这些算法,所以我决定用一种极其易理解的算法————fhq treap,作为tr ...

随机推荐

  1. springsource-tool-suite下载(sts)

    1 新版本的插件下载 1 直接进入官网下载即可 官网地址:http://spring.io/tools/sts/all. 2 spring官网上下载历史版本的spring插件 1 获取新版本的插件的地 ...

  2. Android RelativeLayout 属性 转自互联网

    // 相对于给定ID控件 android:layout_above 将该控件的底部置于给定ID的控件之上; android:layout_below 将该控件的底部置于给定ID的控件之下; andro ...

  3. 吴恩达《Machine Learning Yearning》总结(21-30章)

    21.偏差和方差举例 前提:对于人类而言,可以达到近乎完美的表现(即人类去做分类是误差可以接近0). (1)假设算法的表现如下:训练误差率:1%,开发误差率:11%:此时即为高方差(high vari ...

  4. 在nginx上部署django项目--------Gunicorn+Django+nginx+mysql

    一.安装nginx 以前的博客我有写,这里就不写了 http://www.cnblogs.com/wt11/p/6420442.html 二.安装mysql 我用的mysql5.7  64位的二进制包 ...

  5. Node.js 框架对比之 Express VS Koa

    背景 上图是一个典型的采用 Node.js 开发 web 应用的前后端结构,下面介绍一下 Node 服务层在其中的作用以及使用 Node.js 的一些优劣. Node 服务层作用: 请求代理 传统做法 ...

  6. SpringSecurity 3.2入门(1)框架介绍

    关于Spring Security Spring Security,这是一种基于Spring AOP和Servlet过滤器 [7] 的安全框架.它提供全面的安全性解决方案,同时在 Web 请求级和方法 ...

  7. vsCode代码缩略图

    vsCode配置代码缩略图: 文件--首选项--设置 搜索 minimap    true 打开 false 关闭

  8. 微信token验证源码分享(c#版)

    在开发时遇到一个问题: 上线后提交申请微信提示"您的服务器没有正确响应token验证...",我查看日志发现根本就没有接收到来自微信的参数. 后来我又记录了微信请求方式和请求的字符 ...

  9. SVN服务器在Ubuntu16.04下搭建多版本库详细教程

    1  介绍  Subversion是一个自由,开源的版本控制系统,这个版本库就像一个普通的文件服务器,不同的是,它可以记录每一次文件和目录的修改情况.这样就可 以很方面恢复到以前的版本,并可以查看数据 ...

  10. Django组件——cookie与session

    一.会话跟踪技术 1.什么是会话跟踪技术 可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应. 在JavaWeb中,客户向某一服务器发出第一个请求开始,会话就开始了,直 ...