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

我看正解已经有一大堆了,我就发个不太正经的吧



最近不会高级数据结构的蒟蒻在搞STL,搞完普通平衡树后就看到了这道题,本来想用黑科技pb_ds中的红黑树做的,发现已经有大佬贴了一篇。set的做法也有人发了。

然后蒟蒻的我又想出一个歪法---暴力模拟!!!


  • 你要知道:

首先介绍个STL中应该挺少人知道的函数nth_element(),顾名思义,就是求出区间内第n大的元素,搞这道题刚好合适。

  • 使用:

它的使用也非常方便,直接调用nth_element(pos1,pos2,pos3),

  • 参数介绍:

    pos1是区间的开始位置

    pos2是你要查的元素的在排序后位置,见下面代码实现,一看就懂

    pos3是区间结束的下一个位置

    所以pos1,pos3其实是个左闭右开的区间,如果你不知道这什么意思你就记着pos3是要越界的

  • 其他:

这个时间复杂度好像是O(NlogN),但是不开O2 有80分,开了O2 90分。

STL真是个救急的神器,非常适合对拍

我的代码里还有另一用vector实现方法,但只有50分就不介绍了,有兴趣的可以看一下

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cctype>
#pragma GCC optimize(3)
#define ll int
using namespace std;
const int maxn=200010;
int n,m;
void print(int x)
{
    if(x<0){//负数
       putchar(‘-‘);
      x=-x;
    }
    if(x>9)  print(x/10);
    //递归完后栈里面x的每一位是倒过来的
    putchar(x%10+‘0‘);
}
ll add[maxn],Get[maxn];
ll read()
{
    ll x=0;char ch;short int neg=0;ch=getchar();
    while(!isdigit(ch)){
        neg|=(ch==‘-‘);ch=getchar();
    }
    while(isdigit(ch)){
        x=x*10+ch-48;ch=getchar();
    }
    return neg?-x:x;
}
void solve_1()
{
    vector <ll>a;
    int cnt=1,node=0;
    cin>>m>>n;
    for(register int i=1;i<=m;i++)add[i]=read();
    for(register int i=1;i<=n;i++)Get[i]=read();
    sort(Get+1,Get+1+n);
    for(register int i=1;i<=m&&cnt<=n+1;i++)
    {
       ll x=add[i];    a.insert(upper_bound(a.begin(),a.end(),x),x);
       while(i==Get[cnt]&&cnt<=n+1)
       {
           cout<<a[++node-1]<<endl;
           cnt++;
       }
    }
}
void solve_2()
{
    int cnt=1,node=0;
    ll a[maxn];
    cin>>m>>n;
    for(register int i=1;i<=m;i++)add[i]=read();
    for(register int i=1;i<=n;i++)Get[i]=read();
    sort(Get+1,Get+1+n);
    for(register int i=1;i<=m&&cnt<=n+1;i++)
    {
       a[i]=add[i];
       while(i==Get[cnt]&&cnt<=n+1)
       {
           nth_element(a+1,a+(++node),a+i+1);
           printf("%d\n",a[node]);//print(a[node]);putchar(‘\n‘);
           cnt++;
       }
    }
}
int main()
{
    //solve_1();
    solve_2();
    return 0;
}

感觉这篇题解太水了-逃)

原文地址:https://www.cnblogs.com/Rye-Catcher/p/8464902.html

时间: 2024-10-30 11:36:36

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

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

P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个Black Box要处理一串命令. 命令只有两种: ADD(x):把x元素放进BlackBox; GET:i加1,然后输出Blackhox中第i小的数. 记住:第i小的数,就是Black Box里的数的按从小到大的顺序排序后的第i个元素.例如: 我们来演示一下一个有11个命令的命令串.(如下图所示)

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

题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个Black Box要处理一串命令. 命令只有两种: ADD(x):把x元素放进BlackBox; GET:i加1,然后输出Blackhox中第i小的数. 记住:第i小的数,就是Black Box里的数的按从小到大的顺序排序后的第i个元素.例如: 我们来演示一下一个有11个命令的命令串.(如下图所示) 现在要求找出对于给定的命令串的最好的处理方法.AD

堆or优先队列(洛谷1801 黑匣子_NOI导刊2010提高(06))

Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个Black Box要处理一串命令. 命令只有两种: ADD(x):把x元素放进BlackBox; GET:i加1,然后输出Blackhox中第i小的数. 记住:第i小的数,就是Black Box里的数的按从小到大的顺序排序后的第i个元素.例如: 我们来演示一下一个有11个命令的命令串.(如下图所示) 现在要求找出对于给定的命令串的最好的处理方法.ADD和GET

luoguP1774 最接近神的人_NOI导刊2010提高(02)x

P1774 最接近神的人_NOI导刊2010提高(02) 题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门上方用古代文写着“神的殿堂”.小FF猜想里面应该就有王室的遗产了.但现在的问题是如何打开这扇门…… 仔细研究后,他发现门上的图案大概是说:古代人认为只有智者才是最容易接近神明的.而最聪明的人往往通过一种仪式选拔出来.仪式大概是指,即将隐退的智者为他的候选人写下一串无序的数字,并让他们进行一种操作,即

P1807 最长路_NOI导刊2010提高(07)

P1807 最长路_NOI导刊2010提高(07) 题目描述 设G为有n个顶点的有向无环图,G中各顶点的编号为1到n,且当为G中的一条边时有i < j.设w(i,j)为边的长度,请设计算法,计算图G中<1,n>间的最长路径. 输入输出格式 输入格式: 输入文件longest.in的第一行有两个整数n和m,表示有n个顶点和m条边,接下来m行中每行输入3个整数a,b,v(表示从a点到b点有条边,边的长度为v). 输出格式: 输出文件longest.out,一个整数,即1到n之间的最长路径.如

洛谷P1774 最接近神的人_NOI导刊2010提高(02) [2017年6月计划 线段树03]

P1774 最接近神的人_NOI导刊2010提高(02) 题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门上方用古代文写着“神的殿堂”.小FF猜想里面应该就有王室的遗产了.但现在的问题是如何打开这扇门…… 仔细研究后,他发现门上的图案大概是说:古代人认为只有智者才是最容易接近神明的.而最聪明的人往往通过一种仪式选拔出来.仪式大概是指,即将隐退的智者为他的候选人写下一串无序的数字,并让他们进行一种操作,即

洛谷P1776 宝物筛选_NOI导刊2010提高(02)

P1776 宝物筛选_NOI导刊2010提高(02) 题目描述 终于,破解了千年的难题.小FF找到了王室的宝物室,里面堆满了无数价值连城的宝物……这下小FF可发财了,嘎嘎.但是这里的宝物实在是太多了,小FF的采集车似乎装不下那么多宝物.看来小FF只能含泪舍弃其中的一部分宝物了……小FF对洞穴里的宝物进行了整理,他发现每样宝物都有一件或者多件.他粗略估算了下每样宝物的价值,之后开始了宝物筛选工作:小FF有一个最大载重为W的采集车,洞穴里总共有n种宝物,每种宝物的价值为v[i],重量为w[i],每种

P1774 最接近神的人_NOI导刊2010提高(02)

P1774 最接近神的人_NOI导刊2010提高(02) 题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门上方用古代文写着“神的殿堂”.小FF猜想里面应该就有王室的遗产了.但现在的问题是如何打开这扇门…… 仔细研究后,他发现门上的图案大概是说:古代人认为只有智者才是最容易接近神明的.而最聪明的人往往通过一种仪式选拔出来.仪式大概是指,即将隐退的智者为他的候选人写下一串无序的数字,并让他们进行一种操作,即

洛谷 P1796 汤姆斯的天堂梦_NOI导刊2010提高(05)

P1796 汤姆斯的天堂梦_NOI导刊2010提高(05) 题目描述 汤姆斯生活在一个等级为0的星球上.那里的环境极其恶劣,每天12小时的工作和成堆的垃圾让人忍无可忍.他向往着等级为N的星球上天堂般的生活. 有一些航班将人从低等级的星球送上高一级的星球,有时需要向驾驶员支付一定金额的费用,有时却又可以得到一定的金钱. 汤姆斯预先知道了从0等级星球去N等级星球所有的航线和需要支付(或者可以得到)的金钱,他想寻找一条价格最低(甚至获得金钱最多)的航线. 输入输出格式 输入格式: 第一行一个正整数N(