제출 #899343

#제출 시각아이디문제언어결과실행 시간메모리
899343davitmargFinancial Report (JOI21_financial)C++17
100 / 100
377 ms33696 KiB
/*
DavitMarg
In a honky-tonk,
Down in Mexico
*/
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#include <map>
#include <unordered_map>
#include <set>
#include <unordered_set>
#include <queue>
#include <bitset>
#include <stack>
#include <cassert>
#include <iterator>
#include <random>
#include <chrono>
#define mod 998244353ll
#define LL long long
#define LD long double
#define MP make_pair    
#define PB push_back
#define all(v) v.begin(), v.end()
#define fastIO ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
using namespace std;
 
const int N = 500005;
 
int n, d;
int a[N];
 
 
int par[N], sz[N], mn[N];
 
void init_dsu()
{
    for (int i = 1; i <= n; i++)
    {
        par[i] = i;
        mn[i] = i;
        sz[i] = 1;
    }
}
 
int get_par(int u)
{
    if (par[u] == u)
        return u;
    return par[u] = get_par(par[u]);
}
 
void merge(int u, int v)
{
    u = get_par(u);
    v = get_par(v);
    if (u == v)
        return;
    if (sz[u] < sz[v])
        swap(u, v);
    par[v] = u;
    sz[u] += sz[v];
    mn[u] = min(mn[u], mn[v]);
}
 
 
int dp[N], lst[N];
 
void init()
{
    init_dsu();
    vector<pair<int, int>> v;
    v.push_back(MP(-1, 0));
    for (int i = 1; i <= n; i++)
        v.push_back(MP(a[i], i));
    sort(all(v));
 
    set<int> s;
    s.insert(0);
    s.insert(n + 1);
 
    for (int i = 1; i <= n; i++)
    {
        int j = v[i].second;
        auto it = s.lower_bound(j);
        int r = *it;
        it--;
        int l = *it;
        if (j - l <= d && l > 0)
			merge(j, l);
        if (r - j <= d && r <= n)
            merge(j, r);
 
        lst[j] = mn[get_par(j)];
 
        s.insert(j);
    }
 
 
}
 
int stress_solve()
{
    int best = 0;
    for (int mask = 0; mask < (1 << n); mask++)
    {
        vector<int> v;
        for (int i = 0; i < n; i++)
        {
            if(((1 << i) & mask) == 0)
                continue;
            v.push_back(i + 1);
        }
        int mx = -mod;
        int res = 0;
        for (int i = 0; i < v.size(); i++)
        {
            if (a[v[i]] > mx)
            {
				mx = a[v[i]];
				res++;
			}
            if (i && v[i] - v[i - 1] > d)
            {
                res = 0;
                break;
            }
        }
        if (res == 6)
            res = res * 1;
        best = max(best, res);
	}
    return best;
}
 
int t[4 * N];
 
void build(int v, int l, int r)
{
    t[v] = 0;
    if(l == r)
        return;
    int mid = (l + r) / 2;
    build(2 * v, l, mid);
    build(2 * v + 1, mid + 1, r);
}
 
void upd(int v, int l, int r, int pos, int val)
{
    if (l == r)
    {
		t[v] = val;
		return;
	}
	int mid = (l + r) / 2;
	if(pos <= mid)
		upd(2 * v, l, mid, pos, val);
	else
		upd(2 * v + 1, mid + 1, r, pos, val);
	t[v] = max(t[2 * v], t[2 * v + 1]);
}
 
int get(int v, int l, int r, int i, int j)
{
    if (i > j)
        return 0;
    if (l == i && r == j)
        return t[v];
    int mid = (l + r) / 2;
    return max(get(2 * v, l, mid, i, min(j, mid)), get(2 * v + 1, mid + 1, r, max(i, mid + 1), j));
}
 
void solve()
{
    cin >> n >> d;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    init();
 
    build(1, 1, n);
 
    vector<pair<int, int> > v;
    for (int i = 1; i <= n; i++)
		v.push_back(MP(a[i], i));
 
    sort(all(v));
    reverse(all(v));
    while (!v.empty())
    {
        int val = v.back().first;
        vector<int> cur;
        while (!v.empty() && v.back().first == val)
        {
			cur.push_back(v.back().second);
			v.pop_back();
		}
 
        for (int j = 0; j < cur.size(); j++)
        {
            int i = cur[j];
            dp[i] = get(1, 1, n, lst[i], i) + 1;
        }
 
 
        for (int j = 0; j < cur.size(); j++)
        {
			int i = cur[j];
			upd(1, 1, n, i, dp[i]);
		}
 
    }
 
    int ans = 1;
    for(int i = 1; i <= n; i++)
		ans = max(ans, dp[i]);
 
    cout << ans << endl;
    // cout << stress_solve() << endl;
}
 
 
int main()
{
    fastIO;
    int T = 1;
    //cin >> T;
    while (T--)
    {
        solve();
    }
 
    return 0;
}
 
/*
 
 
11 5
1 10 10 10 10 10 10 2 3 4 5 
 
 
*/

컴파일 시 표준 에러 (stderr) 메시지

Main.cpp: In function 'int stress_solve()':
Main.cpp:121:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  121 |         for (int i = 0; i < v.size(); i++)
      |                         ~~^~~~~~~~~~
Main.cpp: In function 'void solve()':
Main.cpp:203:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  203 |         for (int j = 0; j < cur.size(); j++)
      |                         ~~^~~~~~~~~~~~
Main.cpp:210:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  210 |         for (int j = 0; j < cur.size(); j++)
      |                         ~~^~~~~~~~~~~~
#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...