首页 > 其他分享 >abc--281--E

abc--281--E

时间:2022-12-10 22:33:19浏览次数:54  
标签:abc end -- int st1 281 删去 集合

思路

纯模拟
把前面的数放入两个集合中,第一个集合A是前k小,第二个集合B用来存大一点的数据

最开始加数据:如果A多了,那就把A最后一个放到B

后面更新:首先把这个新的数加在A里面,然后把A最后一个数放在B
然后删去前面的那个数,如果B中有,直接删去。
如果B没有,那就在A中删去,然后把B中的第一个放进来
注意:输出数据的时候要使用迭代器,不然会把所有相同的元素都删去

代码

//直接分成两个集合就可以了,然后判断一下最开始的那个数是在哪一个集合里面的
//如果在后面那个集合,就直接删去
//如果在前面那个集合,就先删去,然后从后面哪一个数过来
//也就是直接暴力模拟
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
const int M=2e5+5;

int a[M];
multiset<int>st1,st2;

int main() {
    int n,m,k;
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++)cin>>a[i];
    ll sum=0;
    for(int i=1;i<=m;i++) {
        sum+=a[i];
        st1.insert(a[i]);
        if(st1.size()>k) {
            st2.insert(*prev(st1.end()));
            sum-=*prev(st1.end());
            st1.erase(prev(st1.end()));
        }
    }
    //注意删除的时候,只能删一个
    //也就是要使用迭代器进行删去
    cout<<sum<<' ';
    for(int i=m+1;i<=n;i++) {
        sum+=a[i];
        st1.insert(a[i]);//优先插入第一个
        st2.insert(*prev(st1.end()));
        sum-=*prev(st1.end());
        st1.erase(prev(st1.end()));//把最后一个不要
        //查找刚刚那个数
        if(st2.find(a[i-m])!=st2.end())st2.erase(st2.find(a[i-m]));
        else {
            sum-=a[i-m];
            st1.erase(st1.find(a[i-m]));
            sum+=*(st2.begin());
            st1.insert(*(st2.begin()));
            st2.erase(st2.begin());
        }
        cout<<sum<<' ';
    }
    return 0;
}
//模拟才是第一生产力呀

标签:abc,end,--,int,st1,281,删去,集合
From: https://www.cnblogs.com/basicecho/p/16972486.html

相关文章

  • java第三次blog总结
    前言对10~16周学习的内容,由本次博客来进行一个总结。1.这几周主要是电信收费系列题目,考察我们对于正则表达式的掌握于运用。2.对......
  • IDEA2022双击图标打不开,无反应?
    分析:Win10电脑以前安装过IDEA2019,并且是解决试用版本第三方jar包配置​​jetbrains-agent.jar​​,直接运行bin目录下idea.bat报错尝试将JDK1.8升级到11问题一样解决方法:打......
  • redis目录中的重要文件
    ......
  • 【C语言】指针运算、指针+-整数、指针-指针、指针的关系运算、标准关系、标准规定、指
    ......
  • 10:Java人脸识别认证-Java API 实战
    (目录)1.提出问题,引入SDK的概念什么是SDK?我们并不具备开发人脸识别的能力,但我们可以用大公司已经开发好的工具或者功能,来实现人脸识别,而大公司提供的就叫SDK(Software......
  • 实验三-电子公文传输系统1-个人贡献
    1简述你完成的工作2你们小组总共的代码行数,你贡献的代码行数?相关代码链接?3你们小组总共的文档数?你贡献的文档数?相关链接? 一、简述你完成的工作我主要负责使用gmss......
  • 在 Ubuntu 上安装 Discourse 开发环境
     本指南只针对Discourse开发环境的配置,如果你需要在生产环境中安装Discourse,请访问页面:InstallDiscourseinproductionwiththeofficial,supportedinstructio......
  • BLOG-3
    (1)前言: 总结之前所涉及到的知识点、题量、难度等情况    题目集6:知识点:容器、接口、多态、类图相关知识,正则表达式 题量:中  难度:中  题目集7:知识点:容......
  • notepad++8.1.1背景颜色设置护眼色
    Notepad++是免费软件,可以免费使用,自带中文,支持众多计算机程序语言: C,C++,Java,pascal,C#,XML,SQL,Ada,HTML,PHP,ASP, AutoIt, 汇编, DOS批处理,Caml, COBOL, Cmake......
  • blog3
    一、前言这几次的作业题量适中,主要重点封装、继承、多态、抽象类的使用、正则表达式,接口,还有一些和javafx相关的知识,主要题型就是看类图补全代码,其中电信计费系列是比较难......