首页 > 其他分享 >ABC281E 题解

ABC281E 题解

时间:2023-01-24 20:23:26浏览次数:42  
标签:const int 题解 long ABC281E multiset include define

\(\mathcal Solution\)

本题的思路类似于对顶堆。

用两个 multiset 来维护。

\(S_1\) 为第一个 multiset;

\(S_2\) 为第二个 multiset。

\(S_1\) 维护前 \(K\) 个值,\(S_2\) 维护预选的值。

当进入一个数 \(x\),则将 \(x \in S_2\)。

  1. 如果 \(\mathrm{length}(S_1) < K\),则将 \(S_2\) 的最小值加入 \(S_1\)。

  2. 判断 \(S_2\) 的最小值,即 \(S_2\) 的开头,与 \(S_1\) 的最大值,即 \(S_1\) 的结尾,判断大小关系,如果小于,则替换。

  3. 输出 \(\mathrm{ans}_i\)。

  4. 在运行完以上操作后,如果 \(i \ge m\) 时,将 \(A_{i - M + 1}\) 删除,即判断 \(A_{i - M + 1}\) 所在的集合将他删除。

  5. 重复 \(\mathit{1} \sim \mathit{4}\) 操作。

\(\mathcal Code\)

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#include <stack>
#include <cmath>
#include <sstream>
#include <set>
#include <unordered_set>
#include <map>
#include <unordered_map>

#define x first
#define y second
#define IOS ios::sync_with_stdio(false)
#define cit cin.tie(0)
#define cot cout.tie(0)

using namespace std;

typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;

const int N = 200010, M = 100010, MOD = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const LL LLINF = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-8;

int n, m, k;
int w[N];

void solve()
{
	cin >> n >> m >> k;
	
	multiset<int> S;
	multiset<int> S2;
	for (int i = 1; i <= n; i ++ ) cin >> w[i];
	
	LL res = 0;
	for (int i = 1; i <= n; i ++ )
	{
		S2.insert(w[i]);
		while (S.size() < k && S2.size()) res += *S2.begin(), S.insert(*S2.begin()), S2.erase(S2.begin());
		while (S2.size() && (*S2.begin()) < (*S.rbegin())) // 维护序列
		{
			res -= *S.rbegin();
			res += *S2.begin();
			S2.insert(*S.rbegin());
			S.erase(S.find(*S.rbegin()));
			S.insert(*S2.begin());
			S2.erase(S2.begin());
		}
		if (i >= m)
		{
			cout << res << ' ';
			int x = w[i - m + 1];
			if (S.find(x) != S.end()) res -= x, S.erase(S.find(x)); // 只有在 S 集合中才需要减。
			else S2.erase(S2.find(x));
		}
	}
}

int main()
{
	IOS;
	cit, cot;
	int T = 1;
//	cin >> T;
	while (T -- ) solve();
	return 0;
}

标签:const,int,题解,long,ABC281E,multiset,include,define
From: https://www.cnblogs.com/hcywoi/p/17066333.html

相关文章

  • AT_abc277_e 题解
    \(\mathcalSolution\)【题意】给定无向图,当\(a_i=1\)时,该条边才能走。在给我们\(k\)个点,\(S_1,S_2,\cdots,S_k\),到了这些点可以选择是否取反\((1\to0,0\t......
  • 2023牛客寒假算法基础集训营1 个人题解(ACDHKL)
    A.WorldFinal?WorldCup!(I)题意:给10场比赛的点球输赢情况,奇数为A队点球,偶数为B队点球思路:用两个变量x,y来分别存A队当前赢的场次和B队当前赢的场次然后就就扫......
  • CodeForces-907#B 题解
    正文设数组\(c_{x,y,i,j}\)代表\((x,y)\)位置的大格子中\((i,j)\)位置的小格子。很显然,输入中字符的输入顺序是要调整的,实际的顺序是\(x,i,y,j\)。对于输入的\(......
  • 题解
    前言只对SubTask2的选手看过来!!!很好的一道模拟题。坑点分析题目里说的很明白了:只要有\(\ge1\)个带有注释的,就是一定是祖宗人,哪怕在后面或者前面出现过符合乐子人......
  • P3802 小魔女帕琪 题解【期望dp】
    题目传送门P3802解题思路本题的解题思路关键在于分段。每一个结构段的概率在之后的结构段依然适用。判断是否符合这种特性最好方法是随机截取一段观察是否成立发现成......
  • 洛谷P3654 First Step题解
    这是一道暴力枚举。 大致题意:R行C列的棋盘要放下长度为K的线段,“#”表示无法放置,问有多少种放置方法。直接贴代码:#include<bits/stdc++.h>usingnamespacestd;i......
  • P4022 [CTSC2012]熟悉的文章 题解
    题目链接简要题意给定\(m\)个模板串和\(n\)个匹配串,如果一个字符串是一个模板串的子串且长度不小于\(L\)则称其为“熟悉的”,对于每个匹配串,求一个最大的\(L\),满足......
  • 程序员经典问题解答
    帮助在学习、上班的过程中,你是否经常遇到疑难问题无法解决,为此备受折磨?别担心,小编精选多道程序员最头痛的技术问题予以回答。QA小伙伴程序大牛C语言 Q:如何引用一个已经定义......
  • Solution 题解 UVA1389 Hard Life: 最小割,有向图,分数规划,和牛顿迭代
    题解UVA1389HardLife:最小割,有向图,分数规划,和牛顿迭代Preface黑题好耶看到了题解里面大多数是二分,我就来讲一讲简单又快速的DinkelbachAlgorithm吧!0-1分数规划......
  • 洛谷P2036 PERKET题解
     先来审题,主要有以下几个条件:酸度求乘积,苦度求和,两者相减的值最小(当然是绝对值)。下面附上AC代码:#include<bits/stdc++.h>//万能头文件usingnamespacestd;//......