当前位置: 首页 > news >正文

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

题目链接: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;
}

转载于:https://www.cnblogs.com/MisakaAzusa/p/9225885.html

相关文章:

  • nuc9vxqnx_英特尔® NUC 迷你电脑 9 专业套件 - NUC9VXQNX
  • 解决对框架程序集 有间接依赖关系 的问题。
  • 思科交换机接口配置trunk_cisco交换机vlan-trunk的配置详解及应用实例
  • NFS
  • ideal 如何创建jsp页面_jsp的理解
  • 现代软件工程—构建之法---第四章:练习与讨论
  • 网管”必备的五大网络数据分析工具
  • hbase查询性对比 mysql_按照id查询,mysql、es、hbase三个哪个更快?
  • react 动态修改路由_关于React动态加载路由处理的相关问题
  • C#中值和引用
  • pythonrestapicctv_使用pythonrestapi在JIRA中创建问题和自定义字段
  • 第1章 基础语法
  • 苹果动态壁纸库怎么增加_苹果xr如何添加动态壁纸设置
  • 【Selenium-WebDriver问题点】driver和浏览器版本之间的兼容性问题
  • 知识图谱标准化白皮书_知识图谱标准化白皮书正式发布
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 【译】理解JavaScript:new 关键字
  • 2017年终总结、随想
  • android 一些 utils
  • CentOS6 编译安装 redis-3.2.3
  • docker-consul
  • ES6 学习笔记(一)let,const和解构赋值
  • Github访问慢解决办法
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • JSDuck 与 AngularJS 融合技巧
  • linux安装openssl、swoole等扩展的具体步骤
  • PHP 小技巧
  • QQ浏览器x5内核的兼容性问题
  • Redis的resp协议
  • Webpack 4 学习01(基础配置)
  • 关于List、List?、ListObject的区别
  • 解析带emoji和链接的聊天系统消息
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 微信开放平台全网发布【失败】的几点排查方法
  • 微信小程序:实现悬浮返回和分享按钮
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • 扩展资源服务器解决oauth2 性能瓶颈
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • $forceUpdate()函数
  • (1)STL算法之遍历容器
  • (zt)最盛行的警世狂言(爆笑)
  • (定时器/计数器)中断系统(详解与使用)
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • .md即markdown文件的基本常用编写语法
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • :O)修改linux硬件时间
  • @ConditionalOnProperty注解使用说明
  • [ C++ ] STL---string类的模拟实现
  • [1204 寻找子串位置] 解题报告
  • [ABP实战开源项目]---ABP实时服务-通知系统.发布模式
  • [Android]How to use FFmpeg to decode Android f...
  • [BJDCTF 2020]easy_md5