Submission #1310585

#TimeUsernameProblemLanguageResultExecution timeMemory
1310585miniobFinancial Report (JOI21_financial)C++20
100 / 100
357 ms24080 KiB
#include <bits/stdc++.h>
using namespace std;

int drz[1048576];
int a[300007];
int minnd[300007];
int dp[300007];

void ustaw(int gdzie, int co)
{
	gdzie += 524288;
	drz[gdzie] = co;
	gdzie /= 2;
	while(gdzie != 0)
	{
		drz[gdzie] = max(drz[2 * gdzie], drz[2 * gdzie + 1]);
		gdzie /= 2;
	}
}

int maxx(int l, int r, int curl, int curr, int cur)
{
	if(l > curr || r < curl)
	{
		return 0;
	}
	else if(l <= curl && curr <= r)
	{
		return drz[cur];
	}
	else
	{
		return max(maxx(l, r, curl, (curl + curr) / 2, 2 * cur), maxx(l, r, (curl + curr) / 2 + 1, curr, 2 * cur + 1));
	}
}

bool sfunkc(int x, int y)
{	
	if(a[x] != a[y])
	{
		return a[x] > a[y];
	}
	return x < y;
}

bool sfunkc2(pair<int, int> x, pair<int, int> y)
{	
	if(x.first != y.first)
	{
		return x.first > y.first;
	}
	return x.second < y.second;
}

int main() 
{
	int n, d;
	cin >> n >> d;
	vector<int> kolej;
	for(int i = 1; i <= n; i++)
	{
		cin >> a[i];
		kolej.push_back(i);
	}
	sort(kolej.begin(), kolej.end(), sfunkc);
    deque<int> q;
    for (int i = 1; i <= n; i++) 
    {
        while (!q.empty() && a[q.back()] >= a[i])
        {
        	q.pop_back();
        }
        q.push_back(i);
        while (!q.empty() && q.front() <= i - d)
        {
        	q.pop_front();
        }
        if (i >= d)
        {
        	minnd[i] = a[q.front()];
        }
    }
    vector<pair<int, int>> eventy;
    for(int i = d; i <= n; i++)
    {
    	eventy.push_back({minnd[i], i});
    }
    sort(eventy.begin(), eventy.end(), sfunkc2);
    /*for(auto x : eventy)
	{
		cout << x.first << " " << x.second << endl;
	}*/
	int iter = 0, iter2 = 0, iter3 = 0;
	set<int> mniejsze;
	while(iter < n)
	{
		while(iter3 < n && a[kolej[iter]] == a[kolej[iter3]])
		{
			iter3++;
		}
		while(iter2 < eventy.size() && eventy[iter2].first > a[kolej[iter]])
		{
			mniejsze.insert(eventy[iter2].second);
			iter2++;
		}
		for(int i = iter; i < iter3; i++)
		{
			int ile;
			if(kolej[i] + d <= n)
			{
				auto it = mniejsze.lower_bound(kolej[i] + d);
				if(it == mniejsze.end())
				{
					ile = n;
				}
				else
				{
					ile = *it;
				}
			}
			else
			{
				ile = n;
			}
			dp[kolej[i]] = maxx(kolej[i], ile - 1, 0, 524287, 1) + 1;
		}
		for(int i = iter; i < iter3; i++)
		{
			ustaw(kolej[i] - 1, dp[kolej[i]]);
		}
		iter = iter3;
	}
	cout << maxx(0, n - 1, 0, 524287, 1) << endl;
	return 0;
}
#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...