这道题是一道splay裸题,然而身为蒟蒻的我并不会,所以这道题我维护的是一个大根堆与一个小根堆结合起来的类似沙漏的结构。
本题难点在于询问的不是最大最小值,而是第K小值,所以我们想到了维护这样两个堆,上面是一个大小限定为K-1的大根堆,下面是一个小根堆,每次插入/查询操作时,保持前K-1大的始终在大根堆内。
插入/查询函数:

int heap[200005][3],hsize[3];
int m,n,num[200005],temp;
void put(int x,int i){heap[++hsize[i]][i]=x;int son=hsize[i],pa=son>>1;while(pa>=1){if(i==1){if(heap[pa][i]>heap[son][i]){int t=heap[pa][i];heap[pa][i]=heap[son][i];heap[son][i]=t;son=pa;pa>>=1;}else break;}else {if(heap[pa][i]<heap[son][i]){int t=heap[pa][i];heap[pa][i]=heap[son][i];heap[son][i]=t;son=pa;pa>>=1;}else break;}   }
}
int get(int i){int rv=heap[1][i];heap[1][i]=heap[hsize[i]--][i];int pa=1,son;while(pa<=(hsize[i]>>1)){if(i==1) son=heap[pa<<1][i]<heap[pa<<1|1][i]?pa<<1:pa<<1|1;else son=heap[pa<<1][i]>heap[pa<<1|1][i]?pa<<1:pa<<1|1;if(i==1){if(heap[pa][i]>heap[son][i]){int t=heap[pa][i];heap[pa][i]=heap[son][i];heap[son][i]=t;pa=son;}else break;}else {if(heap[pa][i]<heap[son][i]){int t=heap[pa][i];heap[pa][i]=heap[son][i];heap[son][i]=t;pa=son;}else break;}   }return rv;
}

对整体的插入/查询:

void putt(int x){put(x,1);if(x==heap[1][1]){get(1);put(x,2);int t=get(2);put(t,1);}
}
int gett(){temp++;int rv=get(1);put(rv,2);return rv;
}

附:跑得飞快的代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <cmath>
using namespace std;
int read(){int rv=0,fh=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-') fh=-1;c=getchar();}while(c>='0'&&c<='9'){rv=(rv<<1)+(rv<<3)+c-'0';c=getchar();}return rv*fh;
}
int heap[200005][3],hsize[3];
int m,n,num[200005],temp;
void put(int x,int i){heap[++hsize[i]][i]=x;int son=hsize[i],pa=son>>1;while(pa>=1){if(i==1){if(heap[pa][i]>heap[son][i]){int t=heap[pa][i];heap[pa][i]=heap[son][i];heap[son][i]=t;son=pa;pa>>=1;}else break;}else {if(heap[pa][i]<heap[son][i]){int t=heap[pa][i];heap[pa][i]=heap[son][i];heap[son][i]=t;son=pa;pa>>=1;}else break;}   }
}
int get(int i){int rv=heap[1][i];heap[1][i]=heap[hsize[i]--][i];int pa=1,son;while(pa<=(hsize[i]>>1)){if(i==1) son=heap[pa<<1][i]<heap[pa<<1|1][i]?pa<<1:pa<<1|1;else son=heap[pa<<1][i]>heap[pa<<1|1][i]?pa<<1:pa<<1|1;if(i==1){if(heap[pa][i]>heap[son][i]){int t=heap[pa][i];heap[pa][i]=heap[son][i];heap[son][i]=t;pa=son;}else break;}else {if(heap[pa][i]<heap[son][i]){int t=heap[pa][i];heap[pa][i]=heap[son][i];heap[son][i]=t;pa=son;}else break;}   }return rv;
}
void putt(int x){put(x,1);if(x==heap[1][1]){get(1);put(x,2);int t=get(2);put(t,1);}
}
int gett(){temp++;int rv=get(1);put(rv,2);return rv;
}
int f[200005];
int main(){freopen("in.txt","r",stdin);m=read();n=read();for(int i=1;i<=m;i++){num[i]=read();}for(int i=1;i<=n;i++){f[read()]++;}for(int i=1;i<=m;i++){putt(num[i]);while(f[i]){printf("%d\n",gett());f[i]--;}}/*for(int i=1;i<=10000;i++){put(rand(),2);}for(int i=1;i<=10000;i++){printf("%d ",get(2));}*/fclose(stdin);return 0;
}

转载于:https://www.cnblogs.com/Mr-WolframsMgcBox/p/7868354.html

洛谷 [P1801] 黑匣子相关推荐

  1. 洛谷P1801 黑匣子 双堆套路的使用

    题意 题目链接 题解 这道题本可以用Treap暴力求解出来,但是不够优雅,因为没有充分利用到题目中给的条件,那就是要求的ithithith小的值的iii是单调递增的. 我们用两个堆来维护,大顶堆和小顶 ...

  2. 洛谷P1801 黑匣子

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

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

    题目大意 给出一个长度为\(M\)序列\(A\),表示第\(i\)回合将\(A_i\)放入一个箱子中(共有\(M\)回合),再给出一个长度为\(N\)序列\(B\),表示在\(B_i\)回合执行一次\ ...

  4. 洛谷 - 试炼场(全部题目备份)

    整理的算法模板合集: ACM模板 目录 1.新手村 1 - 1 洛谷的第一个任务 1 - 2 顺序与分支 1 - 3 循环!循环!循环! 1 - 4 数组 1 - 5 简单字符串 1 - 6 过程函数 ...

  5. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

  6. 洛谷 P1142 轰炸

    洛谷 P1142 轰炸 题目描述 "我该怎么办?"飞行员klux向你求助. 事实上,klux面对的是一个很简单的问题,但是他实在太菜了. klux要想轰炸某个区域内的一些地方,它们 ...

  7. 洛谷 P1387 最大正方形

    P1387 最大正方形 题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=10 ...

  8. 洛谷P2763 试题库问题

    题目:https://www.luogu.org/problemnew/show/P2763 题目描述 «问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性. ...

  9. 动态规划——洛谷_P1057传球游戏

    题目: 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏.游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球, ...

最新文章

  1. 这个40M的小工具助你在windows下处理数据如虎添翼!!
  2. 自动化运维——一键安装MySQL
  3. ASP.NET的命名空间
  4. 管道抛光防锈机器人_全国首创!嵊州企业的这项防锈技术用在了雪龙号上
  5. 使用TLS安全的访问Minio服务​​​​​​​
  6. python实现爬虫下载美女图片
  7. IFIX 需要权限打开某个画面
  8. Python数据分析(二) —— 进阶绘制双折线图
  9. Uplift Model
  10. 公考复盘(二)——第五季第六季
  11. 生死看淡,不服就干!我预言这套Java视频必火
  12. java 气象局api_国家气象局免费天气预报接口API
  13. linux下也有很多好游戏
  14. 转-基于NodeJS的14款Web框架
  15. doc转docx文件会乱吗_docx怎么转换成doc?docx转doc方法汇总
  16. python 抓取天涯帖子内容并保存
  17. 水气泵控制原理,三角波发生电路,LM331M/TR芯片,高速运放芯片
  18. Centos 系统分区扩容操作指南
  19. 解决M1芯片版本安装Sketch问题 M1芯片安装那个Sketch版本?Sketch已完美支持M1芯片安装 支持big sur系统
  20. 罗克韦尔自动化收购网络安全公司

热门文章

  1. 重写HttpServlet
  2. 【校招面试 之 C/C++】第15题 C 回调函数
  3. JAVA-初步认识-第五章-数组-常见操作-最值
  4. 代码: html 页面小效果 (集合,待补充)
  5. [转]Javascript 绝句
  6. Python中知识点笔记
  7. mysql 虚拟环境搭建_pycharm虚拟环境virtualnv安装MySQL扩展
  8. 三级工作台抽奖出啥_【早早聊】如何落地一体化运营工作台
  9. 嵌入式开发中使用DDD进行调试
  10. ELK系统之logstash问题:retrying failed action with response code: 429