zoukankan      html  css  js  c++  java
  • Evanyou Blog 彩带

      题目传送门

      分析:这题和另外一个题目中位数非常相似,有兴趣可以先看看,比这一题简单。首先暴力模拟还是别想了,估计30%的数据都有点悬。正解应该是用二叉堆。但是如果用一个堆当然不方便,所以建两个堆,一个大根堆,一个小根堆,每次只要出现询问操作,就把小根堆的堆顶丢进大根堆中维护,然后输出就可以了,但是要注意,操作过程中一定要让大根堆的堆顶小于小根队的堆顶,也就是保证大根堆中的元素就是题目中的前i小的元素。这样题目就变的非常容易了。

      Code:

    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<cmath>
    #include<iostream>
    #include<iomanip>
    #include<algorithm>
    using namespace std;
    const int N=2e5+7;
    int n,m,opt[N],a[N];
    int hmax[N],hmin[N];
    int sizex,sizen;
    inline int read()
    {
      char ch=getchar();int num=0;bool flag=false;
      while(ch<'0'||ch>'9'){if(ch=='-')flag=true;ch=getchar();}
      while(ch>='0'&&ch<='9'){num=num*10+ch-'0';ch=getchar();}
      return flag?-num:num;
    }
    inline void insert_min(int x)
    {
      hmin[++sizen]=x;
      int ka=sizen;
      while(ka>1){
        if(hmin[ka]<hmin[ka/2]){
          swap(hmin[ka],hmin[ka/2]);
          ka/=2;}
        else break;
      }
    }
    inline void insert_max(int x)
    {
      hmax[++sizex]=x;
      int ka=sizex;
      while(ka>1){
        if(hmax[ka]>hmax[ka/2]){
          swap(hmax[ka],hmax[ka/2]);
          ka/=2;}
        else break;
      }
    }
    inline void delet_min()
    {
      hmin[1]=hmin[sizen--];
      int ka=1,s=ka*2;
      while(s<=sizen){
        if(s<sizen&&hmin[s+1]<hmin[s])
          s++;
        if(hmin[s]<hmin[ka]){
          swap(hmin[s],hmin[ka]);
          ka=s;s=ka*2;}
        else break;
      }
    }
    inline void delet_max()
    {
      hmax[1]=hmax[sizex--];
      int ka=1,s=ka*2;
      while(s<=sizex){
        if(s<sizex&&hmax[s+1]>hmax[s])
          s++;
        if(hmax[s]>hmax[ka]){
          swap(hmax[s],hmax[ka]);
          ka=s;s=ka*2;}
        else break;
      }
    }
    inline int change()
    {
      int ka=hmin[1];
      delet_min();
      insert_max(ka);
      return ka;
    }
    int main()
    {
      bool flag=false;
      n=read();m=read();
      for(int i=1;i<=n;i++)
        a[i]=read();
      for(int i=1;i<=m;i++){
        int x=read();opt[x]++;}
      for(int i=1;i<=n;i++){
        insert_min(a[i]);
        if(flag&&hmin[1]<hmax[1]){
          int minn=hmin[1];
          int maxx=hmax[1];
          delet_min();insert_min(maxx);
          delet_max();insert_max(minn);
        }
        while(opt[i]>0){
          flag=true;opt[i]--;
          int ans=change();
          printf("%d
    ",ans);
        }
      }
      return 0;
    }

     

  • 相关阅读:
    电脑快捷键大全
    js实现页面跳转
    List转换为字符串方法
    Bootstrap4显示和隐藏元素
    反向代理和正向代理区别
    springboot系列一:工作环境无法联网下快速搭建boot项目
    英语故事系列:冠状病毒传播或导致2020首季度全球经济出现萎缩
    BBS网站的制作
    Flask-SQLAlchemy数据库操作
    step-by-step install Nginx反向代理服务器(Ubuntu 18.04 LTS)(转)
  • 原文地址:https://www.cnblogs.com/cytus/p/8597256.html
Copyright © 2011-2022 走看看