大常数选手 MLE #10 求调
查看原帖
大常数选手 MLE #10 求调
714254
tder楼主2024/6/9 12:50

st 表做法 /kel

#include <bits/stdc++.h>
using namespace std;
// #define int long long
#define endl '\n'
const int N = 1e6 + 5, M = 1e4 + 5;
template<class Tp>
bool _Cmp(Tp a, Tp b) {
	return a > b;
}
template<class Tp, bool (*Cmp)(Tp a, Tp b) = _Cmp>
class St {
	private:
		int z = 0;
		Tp Max(Tp a, Tp b) {
			if(Cmp(a, b)) return a;
			else return b;
		}
	public:
		Tp s[N][(int)log2(M) + 5];
		void build(int n) {
			z = n;
			int t = log2(z);
			for(int j = 1; j <= t; j++) 
				for(int i = 1; i <= z - (int)pow(2, j) + 1; i++)
					s[i][j] = Max(s[i][j - 1], s[i + (int)pow(2, j - 1)][j - 1]);
		}
		Tp get(int l, int r) {
			int k = log2(r - l + 1);
			return Max(s[l][k], s[r - (int)pow(2, k) + 1][k]);
		}
};
bool cmp(int x, int y) {
	return x < y;
}
int n, m, c, f;
St<int> mx; St<int, cmp> mn;
signed main() {
	cin>>n>>m>>c;
	for(int i = 1; i <= n; i++) cin>>mx.s[i][0], mn.s[i][0] = mx.s[i][0];
	mx.build(n); mn.build(n);
	for(int i = 1; i + m - 1 <= n; i++) if(mx.get(i, i + m - 1) - mn.get(i, i + m - 1) <= c) cout<<i<<endl, f = 1;
	if(!f) cout<<"NONE"<<endl;
}
2024/6/9 12:50
加载中...