【题解】LuoGu6294:[eJOI2017]游戏

原题传送门
其实这道题目是暴力
数值 < = n <=n <=n大有可为,可以开桶
先把前面 p p p个压进来,然后对于后面待加入的那个数,如果大于序列最大值,直接统计;否则压进来,维护一个序列最大值指针,找到当前最大的统计
复杂度是 O ( n k ) O(nk) O(nk)
Code:

#include <bits/stdc++.h>
#define maxn 100010
#define LL long long
using namespace std;
LL n, m, a[maxn], num[maxn];

inline int read(){
    
    
	int s = 0, w = 1;
	char c = getchar();
	for (; !isdigit(c); c = getchar()) if (c == '-') w = -1;
	for (; isdigit(c); c = getchar()) s = (s << 1) + (s << 3) + (c ^ 48);
	return s * w;
}

int main(){
    
    
	n = read(), m = read();
	for (int i = 1; i <= n; ++i) a[i] = read();
	while (m--){
    
    
		LL p = read(), Max = n, ans = 0;
		for (int i = 1; i <= p; ++i) ++num[a[i]];
		for (int i = 1; i <= n; ++i){
    
    
			if (i > 1 && i + p - 1 <= n){
    
    
				if (a[i + p - 1] >= Max){
    
    
					if (i & 1) ans += a[i + p - 1]; else ans -= a[i + p - 1];
					continue;
				}
				++num[a[i + p - 1]];
			}
			while (!num[Max]) --Max;
			--num[Max];
			if (i & 1) ans += Max; else ans -= Max;
		}
		printf("%lld\n", ans);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/ModestCoder_/article/details/108501656
今日推荐