Submission #1335940

#TimeUsernameProblemLanguageResultExecution timeMemory
1335940arkanefuryFinancial Report (JOI21_financial)C++20
14 / 100
15 ms2028 KiB
#include <bits/stdc++.h>

using namespace std;
#define pb push_back
#define ins insert
#define lb lower_bound
#define F first
#define S second
#define int long long
#define pii pair<int, int>
#define sz size()
#define in insert
#define len(x) (int)x.size()
#define all(v) v.begin(),v.end()
#define FOR(x, n, m, d) for(int x = n; x <= m; x += d)
#define FORR(x, n, m, d) for(int x = n; x >= m; x -= d)
#define nikita ios_base::sync_with_stdio(0), cin.tie(0);
const int N = 2e5 + 15;
int n, m, x, y, l, r, k, P = 7, mod = 1e9+7, ans, sum, cnt, a[N], timer  = 1, c[N];
int d[N*6], t[N*6], sp[N][21];
int get(int l, int r){
	int k = log2(r-l+1);
	return min(sp[l][k], sp[r- (1 << k) + 1][k]);
}
void push(int v, int l, int r){
	if(d[v]==-1)return;
	if(l!=r)d[v*2] = d[v*2+1] = d[v];
	t[v] = d[v];d[v] = -1;
}
void upd(int l, int r, int val, int v = 1, int tl = 1, int tr = n){
	push(v, tl, tr);
	if(l==r&&tl==tr && val && l == tl){
		t[v] = val;
		return;
	}
	if(l <= tl && tr <= r){
		d[v]=val;
		push(v, tl, tr);
		return;
	}
	if(l > tr || tl > r)return;
	int tm = (tl + tr) >> 1;
	upd(l, r, val, v*2, tl, tm), upd(l, r, val, v*2+1, tm+1, tr);
	t[v] = max(t[v*2], t[v*2+1]);
}
int get1(int r, int v = 1, int tl =1 , int tr = n){
	if(r >= tr)return t[v];
	if(r < tl)return 0;
	int tm = (tl + tr) >> 1;
	return max(get1(r, v*2, tl, tm), get1(r, v*2+1, tm+1, tr));
}
void solve(){
	cin >> n >> m;
	set<int>st;
	map<int, int>mp;
	FOR(i, 1, n, 1){
		cin >> a[i];
		st.in(a[i]);
	}
	k=1;
	FOR(i, 1, n*6, 1)d[i] = -1;
	for(auto i : st)mp[i] = k, k ++;
	FOR(i, 1, n, 1)a[i] = mp[a[i]], sp[i][0] = a[i];
	FOR(i, 1, 20, 1){
		FOR(j, 1, n - (1 << i)+1, 1){
			sp[j][i] = min(sp[j][i-1], sp[j+(1<<(i-1))][i-1]);
		}
	}
	m++;
	FOR(i, 1, n, 1){
		if(i > m)
		upd(1, get(i-m+1, i)-1, 0);
		x = get1(a[i]-1);
		x = max(x+1, get1(a[i]));
		upd(a[i], a[i], x);
		ans = max(ans, x);
	}
	cout << ans;
}
signed main(){
	nikita
	int t=1;
	// cin >> t;
	while(t--)solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...